ListBox和WinForms应用程序

时间:2011-04-13 13:45:32

标签: c# .net winforms listbox

我有一个Windows form1应用程序。这个form1有一个单击按钮。单击该按钮时,将在单击按钮方法中创建一些事件处理程序。在SendText事件处理程序方法中,我创建并显示第二个Form2,我想在form1中打印一个字符串值。

问题在于,在我的ListBox中,我只看到一个字符串而不是所有字符串(我连续发送字符串)。为什么?另外,当新的事件处理程序到达时,不会创建和显示其他Form2表单。

在Form1中,这就是我调用form2的方式:

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);
}

Form2包含:

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

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

2个问题:

  1. 每次激活处理程序时如何创建多个Form2表单(使用线程,不是?)?

  2. 如果新处理程序到达时第一个val是相同的,我如何激活屏幕上已有的form2并在ListBox1中添加一个新项?

  3. 如果可能,请提供示例。

    谢谢。

4 个答案:

答案 0 :(得分:1)

您可以使用form2.ShowDialog();

,而不是使用form2.Show();

这是有效的,因为Show()是无模式的,ShowDialog()是模态的。

Here是对差异的解释。

对于第二个问题,正如其他人所说的那样,您可以将一个表单和启动它的名称添加到字典中。然后,每当您添加另一个正文值时,检查字典是否有重复的名称值。如果存在,请将正文值添加到该特定表单的列表框中。

答案 1 :(得分:0)

尝试使表单静态

static Form2 form2;

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

答案 2 :(得分:0)

使用字典存储按名称排序的已打开Form2:

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();
    }
} 

Form2将包含:

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)
{ 
}

希望这会有所帮助:)

答案 3 :(得分:0)

如果我做对了,你想要:

  • 发送(...)
  • 中每个唯一“名称”参数的新form2
  • 以下所有使用相同参数“name”的Send(...)调用应将“body”参数中的字符串添加到关联form2上的相同列表中

这是怎么回事?

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()...所以如果用户点击x但表单仍然是一个Form2仍然会消失在那里,准备好在下一个事件添加东西时被重新表达......