我有一个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个问题:
每次激活处理程序时如何创建多个Form2表单(使用线程,不是?)?
如果新处理程序到达时第一个val是相同的,我如何激活屏幕上已有的form2并在ListBox1中添加一个新项?
如果可能,请提供示例。
谢谢。
答案 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)
如果我做对了,你想要:
这是怎么回事?
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仍然会消失在那里,准备好在下一个事件添加东西时被重新表达......