C# 列表框和WinForms应用程序
我有一个windows form1应用程序。此表单1有一个单击按钮。单击按钮时,将在click button方法中创建一些事件处理程序。在SendText事件处理程序方法中,我创建并显示第二个Form2,在其中我要打印form1中遇到的字符串值 问题在于,在我的列表框中,我只看到一个字符串,而不是全部(我连续发送字符串)。为什么?另外,当新事件处理程序到达时,不会创建和显示其他Form2表单 在Form1中,我是这样称呼form2的:C# 列表框和WinForms应用程序,c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,我有一个windows form1应用程序。此表单1有一个单击按钮。单击按钮时,将在click button方法中创建一些事件处理程序。在SendText事件处理程序方法中,我创建并显示第二个Form2,在其中我要打印form1中遇到的字符串值 问题在于,在我的列表框中,我只看到一个字符串,而不是全部(我连续发送字符串)。为什么?另外,当新事件处理程序到达时,不会创建和显示其他Form2表单 在Form1中,我是这样称呼form2的: public void Send(string body,
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个问题:
谢谢。尝试将表单设置为静态
static Form2 form2;
public void Send(string body, string name)
{
form2 = new Form2(body);
form2.Text = name;
form2.ShowDialog();
}
而不是使用
form2.ShowDialog()
,可以使用form2.Show()代码>
这是因为Show()是非模态的,ShowDialog()是模态的
这是对差异的一种解释
对于第二个问题,正如其他人所说,您可以将表单及其启动时使用的名称添加到字典中。然后,无论何时添加另一个body值,都要检查字典中是否有重复的name值。如果存在,请将正文值添加到该特定表单的列表框中。使用字典存储按名称排序的打开的表单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();
}
}
希望这有帮助:)如果我做对了,你想要:
- Send(…)中每个唯一“name”参数的新表单2
- 以下所有使用相同参数“name”发送(…)的调用都应将“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();
}
Dictionary myForm2s=newdictionary();
public void Send(字符串主体、字符串名称)
{
Form2 frm=空;
如果(!myForm2s.tryGetValue(名称,输出frm))
{
frm=新表格2(正文);
myForm2s[名称]=frm;
frm.Text=名称;
frm.FormClosing+=新FormClosingEventHandler(Form2_FormClosing);
frm.Show();
}
其他的
{
frm.listBox1.Items.Add(body);//假设listBox1是公共的
frm.Show();
frm.BringToFront();
}
}
void Form2\u FormClosing(对象发送方,FormClosingEventArgs e)
{
e、 取消=真;
((Form2)sender.Hide();
}
(代码未测试…)
您可能需要处理Form2的FormClosing事件。。。使用eventarg取消事件并调用this.Hide()。。。因此,如果用户快速点击x,表单2仍将消失,但表单仍然存在,准备在下一个事件添加内容时重新显示…我恐怕不知道您在寻找什么。如果你有不止一个独立的问题,请分别提问!!!!我将测试你的例子。你能告诉我该如何办理结帐手续吗?还有一个问题:我不能为每个新进程创建一个线程吗?添加了FormClosing处理程序。。。每个新表单2都只是一个新表单。。。没有新流程。。。您可以使每个窗体在其自己的线程中运行,但是您必须担心线程同步以及哪个线程可能访问哪个控件(在.net中,只有创建控件的线程才能访问它),因此您必须调用正确的线程来与控件交互。。。如果您给每个表单一个自己的进程,您将不得不处理进程间通信…如果字典中不包含桌面上已有的名称,那么我会借助线程调用form2。我可以这样做吗?我把所有的名字都放在字典里,但每次有新消息传来,我都会发出一条线索。我可以这样做吗?请帮忙。THX该字典在启动时为空。每次执行send()调用时,它都会查找该名称,如果找到该名称,则会将其添加到关联的表单中。。。否则它将创建一个具有该名称的新表单,在字典中注册它,并显示该新表单。。。桌面上的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();
}