2011-12-03 3 views
1

Form1 및 Form2라고하는 2 개의 폼이 있습니다. Form1에 다음 코드가 있습니다.ComboBox를 업데이트/새로 고침 할 수 없습니다.

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이로드 될 때 먼저 호출됩니다. 콤보 상자 ("프린터")가 올바르게 채워집니다.

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에서 메소드를 실행 : 형식 2에서

, 나는 파일을 작성하고 변경하는 방법이있다. 코드를 단계별로 실행할 때 모든 것이 잘 작동하는 것처럼 보입니다. 오류가 없으면 텍스트 파일에 새로운 값이 기록됩니다. 그러나 콤보 박스는 실제로 새 문자열을 표시하기 위해 업데이트/새로 고침하지 않습니다.

내가 뭘 잘못하고 있니?

EDIT. 나는 printer.Update(); 대신 printer.Refresh();을 Form1 코드에 시도했다.

ps. 내가 사용하고있는 파일은 텍스트 파일이므로 콤보 박스를 바인딩 할 수 없다고 생각합니다. 따라서 printer.DataSource = null을 수행 한 다음 다시 바인딩하면 작동하지 않을 것이라고 생각합니다.

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

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

질문 제목 앞에 "C#"을 붙이지 마십시오. 그 태그가 무엇입니까? –

+0

'음성 메일'개체 란 무엇입니까? 그것은 Form1의 인스턴스입니까? –

+0

죄송합니다. Voicemails는 Form1의 실제 클래스 이름입니다. 방금 단순함으로 Form1을 말했어. – Kurt

답변

0

당신은 가능성이

printer.Refresh(); 

당신은 당신의 콤보 상자를 채우기 위해 데이터 바인딩을 사용하여 볼 수있는 Refresh 방법을 호출 할 필요가 .

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

및 추가

delegate void NoParamDelegate(); 

을 개인 재산으로.

+0

미안하지만, 나는 뭔가 중요한 것을 놓친다는 것을 알았다. 나는 이미 프린터를 시험해 보았다. 새로 고침(); printer.Update(); 대신에. 그것은 위의 코드에 있습니다. 어떤 이유로 든 새로 고침과 업데이트를 모두 사용해야하는 경우가 아니면 데이터 소싱에 대해 살펴 보겠습니다.하지만이 작업을 수행 할 수 있다면 ... – Kurt

+0

그래서 데이터를 소싱하려고 시도했습니다. 메서드의 시작 부분에 "printer.DataSource = null"이 붙어있어 끝에 "printer.DataSource = source"가 붙는 경우에도 콤보 상자는 업데이트되지 않습니다. – Kurt

0

시도합니다 (PrinterDD의 시작이 추가) 방법 :

+0

이 버튼을 사용해도 아무런 차이가없는 것으로 보입니다. – Kurt

+0

"Application.DoEvents()"메서드를 끝에 "PrinterDD"메서드에 추가하려고 했습니까? 또한 InvokeRequired 비트가 확실하지 않은 것으로 확신합니다. 이 메소드의 시작 부분에 entirity가 있어야하고, if 문에 아무것도 없으며, 나중에 모든 기존 코드가 있어야합니다. – Martin

관련 문제