2016-12-10 3 views
0

스플래시 화면에서 지금은 데모 용으로 타이머를 사용하고 있습니다. 하지만 Win32 클래스를 사용하는 클래스를 사용하고 모든 루프가 완료 될 때까지 기다리고 싶습니다. progressBar가 100 %까지 움직일 때까지 루핑하는 동안.progressBar를 사용하여 모든 데이터가로드 될 때까지 어떻게 시작 화면을 사용할 수 있습니까?

form1에서는 아직 아무것도 만들지 않았습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TestingHardware 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
Program.cs에서

내가 실행을 변경 : 시작 화면 폼 디자이너에서

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TestingHardware 
{ 
    public partial class Splash_Screen : Form 
    { 
     Timer tmr; 

     public Splash_Screen() 
     { 
      InitializeComponent(); 
     } 

     private void Splash_Screen_Load(object sender, EventArgs e) 
     { 

     } 

     private void Splash_Screen_Shown(object sender, EventArgs e) 
     { 
      tmr = new Timer(); 
      //set time interval 3 sec 
      tmr.Interval = 3000; 
      //starts the timer 
      tmr.Start(); 
      tmr.Tick += tmr_Tick; 
     } 

     void tmr_Tick(object sender, EventArgs e) 
     { 
      //after 3 sec stop the timer 
      tmr.Stop(); 
      //display mainform 
      Form1 mf = new Form1(); 
      mf.Show(); 
      //hide this form 
      this.Hide(); 
     } 
    } 
} 

나는 추가 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace TestingHardware 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Splash_Screen()); 
     } 
    } 
} 

그런 다음 내가 시작 화면을위한 새로운 양식을 추가 진행 표시 줄.

마지막으로 하드웨어 정보를받는 양식. 끝날 때까지 반복되는 동안 스플래시 화면과 progressBar를 표시하고 싶습니다.

using System; 
using System.Collections; 
using System.Management; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace GetHardwareInfo 
{ 
    public partial class frmMain : Form 
    { 
     public frmMain() 
     { 
      InitializeComponent(); 
      cmbxOption.SelectedItem = "Win32_Processor"; 

     } 

     private void InsertInfo(string Key, ref ListView lst, bool DontInsertNull) 
     { 
      lst.Items.Clear(); 

      ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + Key); 

      try 
      { 
       foreach (ManagementObject share in searcher.Get()) 
       { 

        ListViewGroup grp; 
        try 
        { 
         grp = lst.Groups.Add(share["Name"].ToString(), share["Name"].ToString()); 
        } 
        catch 
        { 
         grp = lst.Groups.Add(share.ToString(), share.ToString()); 
        } 

        if (share.Properties.Count <= 0) 
        { 
         MessageBox.Show("No Information Available", "No Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
         return; 
        } 

        foreach (PropertyData PC in share.Properties) 
        { 

         ListViewItem item = new ListViewItem(grp); 
         if (lst.Items.Count % 2 != 0) 
          item.BackColor = Color.White; 
         else 
          item.BackColor = Color.WhiteSmoke; 

         item.Text = PC.Name; 

         if (PC.Value != null && PC.Value.ToString() != "") 
         { 
          switch (PC.Value.GetType().ToString()) 
          { 
           case "System.String[]": 
            string[] str = (string[])PC.Value; 

            string str2 = ""; 
            foreach (string st in str) 
             str2 += st + " "; 

            item.SubItems.Add(str2); 

            break; 
           case "System.UInt16[]": 
            ushort[] shortData = (ushort[])PC.Value; 


            string tstr2 = ""; 
            foreach (ushort st in shortData) 
             tstr2 += st.ToString() + " "; 

            item.SubItems.Add(tstr2); 

            break; 

           default: 
            item.SubItems.Add(PC.Value.ToString()); 
            break; 
          } 
         } 
         else 
         { 
          if (!DontInsertNull) 
           item.SubItems.Add("No Information available"); 
          else 
           continue; 
         } 
         lst.Items.Add(item); 
        } 
       } 
      } 


      catch (Exception exp) 
      { 
       MessageBox.Show("can't get data because of the followeing error \n" + exp.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 


     } 

     private void RemoveNullValue(ref ListView lst) 
     { 
      foreach (ListViewItem item in lst.Items) 
       if (item.SubItems[1].Text == "No Information available") 
        item.Remove(); 
     } 


     #region Control events ... 

     private void cmbxNetwork_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxNetwork.SelectedItem.ToString(), ref lstNetwork, chkNetwork.Checked); 
     } 

     private void cmbxSystemInfo_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxSystemInfo.SelectedItem.ToString(), ref lstSystemInfo, chkSystemInfo.Checked); 
     } 

     private void cmbxUtility_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxUtility.SelectedItem.ToString(), ref lstUtility, chkUtility.Checked); 
     } 

     private void cmbxUserAccount_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxUserAccount.SelectedItem.ToString(), ref lstUserAccount, chkUserAccount.Checked); 
     } 

     private void cmbxStorage_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxStorage.SelectedItem.ToString(), ref lstStorage, chkDataStorage.Checked); 
     } 

     private void cmbxDeveloper_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxDeveloper.SelectedItem.ToString(), ref lstDeveloper, chkDeveloper.Checked); 
     } 

     private void cmbxMemory_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxMemory.SelectedItem.ToString(), ref lstMemory, chkMemory.Checked); 
     } 

     private void chkHardware_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkHardware.Checked) 
       RemoveNullValue(ref lstDisplayHardware); 
      else 
       InsertInfo(cmbxOption.SelectedItem.ToString(), ref lstDisplayHardware, chkHardware.Checked); 
     } 

     private void cmbxOption_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      InsertInfo(cmbxOption.SelectedItem.ToString(), ref lstDisplayHardware, chkHardware.Checked); 
     } 

     private void chkDataStorage_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkDataStorage.Checked) 
       RemoveNullValue(ref lstStorage); 
      else 
       InsertInfo(cmbxStorage.SelectedItem.ToString(), ref lstStorage, chkDataStorage.Checked); 
     } 

     private void chkMemory_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkMemory.Checked) 
       RemoveNullValue(ref lstMemory); 
      else 
       InsertInfo(cmbxMemory.SelectedItem.ToString(), ref lstStorage, false); 
     } 

     private void chkSystemInfo_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkSystemInfo.Checked) 
       RemoveNullValue(ref lstSystemInfo); 
      else 
       InsertInfo(cmbxSystemInfo.SelectedItem.ToString(), ref lstSystemInfo, false); 
     } 

     private void chkNetwork_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkNetwork.Checked) 
       RemoveNullValue(ref lstNetwork); 
      else 
       InsertInfo(cmbxNetwork.SelectedItem.ToString(), ref lstNetwork, false); 
     } 

     private void chkUserAccount_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkUserAccount.Checked) 
       RemoveNullValue(ref lstUserAccount); 
      else 
       InsertInfo(cmbxUserAccount.SelectedItem.ToString(), ref lstUserAccount, false); 
     } 

     private void chkDeveloper_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkDeveloper.Checked) 
       RemoveNullValue(ref lstDeveloper); 
      else 
       InsertInfo(cmbxDeveloper.SelectedItem.ToString(), ref lstDeveloper, false); 
     } 

     private void chkUtility_CheckedChanged(object sender, EventArgs e) 
     { 
      if (chkUtility.Checked) 
       RemoveNullValue(ref lstUtility); 
      else 
       InsertInfo(cmbxUtility.SelectedItem.ToString(), ref lstUtility, false); 
     } 

     private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      linkLabel1.LinkVisited = true; 
      System.Diagnostics.Process.Start("http://www.ShiraziOnline.net"); 
     } 

     #endregion 


    } 
} 

그것은 Win32 클래스를 사용하고 대신 ListView에 추가하여 각 파트를 List에 추가하려고합니다. 그럼 모든 루프를 완료하고 목록에 컨트롤을 추가 할 때 나는 form1에서 목록을 사용하고 싶습니다. 아니면 이미 form1에로드해야합니까? 확실하지 않습니다.

+0

ProgressBar.Value를 0에서 100 사이의 값으로 업데이트해야합니다. 이렇게하려면 inorder에 총 아이템 수와 현재 어떤 아이템이 있는지 알아야합니다. 또한 ProgressBar.Refresh()를 호출하여 컨트롤을 업데이트합니다. –

답변

0

searcher에 Count 속성이있는 경우 최대 값으로 사용하십시오. 이후로 지속적으로 목록보기 업데이트하는 매우 느립니다) 또한, 당신이 항목을 추가하고 .ResumeLayout (전 .SuspendLayout()를 사용하여 업데이트를 중단하여 ListView에 설정되어 있는지 확인

 int count = 0; 
     try 
     { 
      foreach (ManagementObject share in searcher.Get()) 
      { 
       count++; 
       progressbar1.Value = count * 100/Math.Max(1, searcher.Count); 

: 전류 비율을 결정합니다. 또 다른 권장 사항은 모든 ListViewItem을 목록/배열에 배치 한 다음 ListView를 한 번만 업데이트하는 것입니다. 모든 기록 후 마지막으로 <>

 listViewItems.Add(item); 

그리고을하기 전에 항목을 추가 목록에 추가 된 곳

다음) 그냥 지우기 (후

 lst.SuspendLayout(); 
     lst.Items.Clear() 
     System.Collections.Generic.List<ListViewItem> listViewItems = new System.Collections.Generic.List<ListViewItem>(); 

를 시작에서 목록 만들기 처리되었습니다 List<>를 ListView에 추가하고 업데이트를 다시 시작하십시오.

 try 
     { 
      // All your code here 

      lst.Items.AddRange(listViewItems.ToArray()); 
     } 
     finally 
     { 
      lst.ResumeLayout(); 
     } 
+0

searcher에 대한 IndexOf 속성이 없습니다. –

+0

for 루프마다 증가하는 카운트 변수를 사용하고 그 대신에 루프를 사용하십시오. –

관련 문제