ListBox和WinForms应用程序

本文关键字:应用程序 WinForms ListBox | 更新日期: 2023-09-27 17:49:53

我有一个windows form1应用程序。这个表单有一个点击按钮。单击按钮时,将在click-button方法中创建一些事件处理程序。在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中添加一个新项目?

请提供例子,如果可能的话。

谢谢。

ListBox和WinForms应用程序

不用form2.ShowDialog();,可以用form2.Show();

这是因为Show()是非模态的,ShowDialog()是模态的。

以下是对差异的解释。

对于第二个问题,正如其他人所说,您可以将表单及其初始名称添加到字典中。然后,无论何时添加另一个主体值,都要检查字典中是否有重复的名称值。如果存在,则将body值添加到该特定表单的列表框中。

如果我没弄错的话,你想:

  • 在Send(…)
  • 中为每个唯一的"name"参数添加一个新的form2
  • 所有使用相同参数"name"调用Send(…)的调用都应该将"body"参数中的字符串添加到相关表单上的相同列表中2

这个怎么样?

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仍然会消失,但表单仍然在那里,准备在下一个事件添加内容时重新显示…

尝试使你的表单静态

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

使用字典存储按名称排序的已打开的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)
{ 
}

希望这对你有帮助