2011-04-13 202 views
0

我有一個Windows Form1應用程序。這個form1有一個點擊按鈕。點擊按鈕時,點擊按鈕方法中會創建一些事件處理程序。在SendText事件處理程序方法中,創建並顯示第二個Form2,我想要在form1中打印一個字符串值。ListBox和WinForms應用程序

問題是,在我的ListBox中,我只看到一個字符串,而不是全部(我連續發送字符串)。爲什麼?另外,當新的事件處理程序到達時,不會創建並顯示額外的Form2表單。

在Form1,這是我打電話窗口2的方式:

public void Send(string body, string name) 
{ 
    Form2 form2 = new Form2(body); 
    form2.Text = name; 
    form2.ShowDialog(); 
} 

public void OnMessage(first val, second vall) 
{ 
    send(string val1, string va2); 
} 

窗體2包含:

public Form2(string s) 
{ 
    InitializeComponent(); 
    listBox1.Items.Add(s); 
} 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
} 

2個問題:

  1. 如何建立每個多窗體2形式處理程序被激活的時間(使用線程,不?)?

  2. 如果第一個val與新處理程序到達時相同,如何激活已經在屏幕上的form2並在ListBox1中添加新項目?

請提供例子,如果可能的話。

謝謝。

+0

恐怕,我沒有任何線索正在找。而且,如果你有不止一個離散問題,請分別問問他們! – 2011-04-13 13:59:29

回答

0

,如果我得到這個權利,你想要:

  • 一個新的form2 for發送(...)中的每個唯一「名稱」參數
  • 所有以下呼叫發送(...))與相同的參數「名稱」應添加到「body」參數中的字符串到相關表單上的相同列表中

這是怎麼回事?

Dictionary<string,From2> myForm2s = new Dictionary<string,Form2>(); 

public void Send(string body, string name) 
{ 
    Form2 frm = null; 
    if(!myForm2s.tryGetValue(name,out frm)) 
    { 
     frm = new Form2(body); 
     myForm2s[name] = frm; 
     frm.Text = name; 
     frm.FormClosing += new FormClosingEventHandler(Form2_FormClosing); 
     frm.Show(); 
    } 
    else 
    { 
     frm.listBox1.Items.Add(body); // assuming listBox1 is public 
     frm.Show(); 
     frm.BringToFront(); 
    } 
} 
void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 
    ((Form2)sender).Hide(); 
} 

(代碼沒有測試...)

你可能會要處理的Form2的的FormClosing事件......使用eventarg取消該事件並調用this.Hide()...等等一個Form2仍然會消失,如果用戶點擊X但形式仍然存在,當下一個事件添加一些東西時,準備重新顯示...

+0

我會測試你的例子。你能告訴我應該如何處理表格關閉?還有一個問題:我不能爲每個新流程創建一個線程嗎? – Elli 2011-04-13 14:31:38

+0

增加了FormClosing-Handler ...每個新的form2只是一個新的表單...沒有新的過程...你可以讓每個表單在自己的線程中運行,但是你將不得不擔心線程同步和哪個線程可能訪問哪些控制(在.net中,只有創建控件的線程纔可以訪問它),因此您必須調用正確的線程才能與控件進行交互......如果您將每個窗體都設置爲自己的進程,則必須處理進程間通信... – DarkSquirrel42 2011-04-13 14:44:33

+0

如果字典不包含已經在桌面上的名稱,那麼我在線程的幫助下調用form2。我可以那樣做嗎?我把所有的名字都放在字典中,但是每次有新消息出現時我都會調用一個線程。我可以這樣做嗎?請幫忙。 thx – Elli 2011-04-13 15:02:55

0

儘量讓你的表單靜態

static Form2 form2; 

public void Send(string body, string name) 
{   
    form2 = new Form2(body); 
    form2.Text = name; 
    form2.ShowDialog(); 
} 
1

而不是使用form2.ShowDialog();的,你可以使用form2.Show();

這工作,因爲展()是無模式,ShowDialog的()是模態。

Here是對差異的解釋。

對於第二個問題,正如其他人所說的,您可以添加一個表單和它發起到字典的名稱。然後,無論何時添加其他主體值,都會檢查字典中是否有重複的名稱值。如果存在,請將該正文值添加到該特定表單的列表框中。

0

使用字典存儲打開的窗體2下令名稱:

private Dictionary<string, Form2> forms = new Dictionary<string, Form2>(); 

public void Send(string body, string name) 
{ 
    if(forms.ContainsKey(name)) 
    { 
     forms[name].AddNewItem(body); 
    } 
    else{ 
     Form2 form2 = new Form2(body); 
     form2.Text = name; 
     forms.Add(name, form2); 
     form2.ShowDialog(); 
    } 
} 

1和Form 2將包含:

public Form2(string s) 
{ 
    InitializeComponent(); 
    listBox1.Items.Add(s); 
} 

public void AddNewItem(string s) 
{ 
    listBox1.Items.Add(s); 
} 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
} 

希望這有助於:)