2011-12-03 63 views
1

我有2個窗體,我將調用Form1和Form2。在Form1中是以下代碼:無法獲取組合框更新/刷新

public void PrinterDD() 
{ 
    printer.Items.Clear(); 
    string sprinters = @"filepath"; 
    using (StreamReader reader = new StreamReader(sprinters)) 
     try 
     { 
      while (!reader.EndOfStream) 
      { 
       string strPrnItem = reader.ReadLine(); 
       MessageBox.Show(strPrnItem); //just here for troubleshooting purposes 
       printer.Items.Add(strPrnItem); 
      } 
     } 
     finally 
     { 
      reader.Close(); 
      printer.Update(); 
      printer.SelectedIndex = 0; 
     } 
} 

當Form1加載時,將首先調用此方法。組合框(「打印機」)正確填充。

在窗體2,我要寫入文件,並改變它的方法:

private void accept_Click(object sender, EventArgs e) 
{ 
    this.AcceptButton = accept; 
    if (selectedprinters != null && selectedprinters.Items != null && selectedprinters.Items.Count > 0) 
    { 
     File.Delete(sprinters); 
     StreamWriter writer = new StreamWriter(sprinters); 
     try 
     { 
      foreach (object item in selectedprinters.Items) 
      { 
       writer.WriteLine(item.ToString()); 
      } 
     } 
     finally 
     { 
      writer.Close(); 
      Voicemails.PrinterDD(); 
     }     
    } 
    this.Close(); 
} 

Voicemails.PrinterDD();運行從上方Form1中的方法。在逐步完成代碼時,一切似乎都正常;沒有錯誤,文本文件會被寫入新的值。但組合框永遠不會更新/刷新以顯示新的字符串。

我在做什麼錯?

編輯。我在Form1代碼中嘗試了printer.Refresh();而不是printer.Update();

ps。我使用的文件是一個文本文件,所以我不認爲我能夠綁定組合框,所以我不認爲做printer.DataSource = null,然後重新綁定它將工作。

+0

請不要在「C#」前加題目標題。這就是標籤的用途? –

+0

什麼是「語音信箱」對象?它是「Form1」的一個實例嗎? –

+0

對不起。語音郵件是Form1的實際類名稱。我只是爲了簡單起見而說Form1 – Kurt

回答

0

您可能需要調用Refresh方法

printer.Refresh(); 

你可能看使用數據綁定填寫您的組合框:

List<string> source = new List<string>(); 
while (!reader.EndOfStream) 
    source.Add(reader.ReadLine()); 

printer.DataSource = source; 
printer.Refresh(); 
+0

對不起,我知道我會錯過一些重要的東西。我已經試過printer.Refresh();代替printer.Update();這在上面的代碼中。除非我需要使用刷新和更新出於某種原因。 我會研究數據採購,但如果我能夠得到這個工作... – Kurt

+0

所以我嘗試了數據採購。即使在方法開始處有一個「printer.DataSource = null」,最後仍然是「printer.DataSource = source」,組合框永遠不會更新。 – Kurt

0

嘗試添加該到PrinterDD的start()方法。

if (InvokeRequired) 
{ 
    BeginInvoke(new NoParamDelegate(PrinterDD)); 
    return; 
} 

,並添加:

delegate void NoParamDelegate(); 

爲私有財產。

+0

試過這個按鈕似乎沒有任何區別。 – Kurt

+0

您是否嘗試在最後的「PrinterDD」方法中添加「Application.DoEvents()」方法。另外,我不確定我在InvokeRequired位清楚。這需要在方法開始的時候纔是完整的,if語句中沒有其他內容,以及之後的所有現有代碼。 – Martin