Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表框和WinForms应用程序_C#_.net_Winforms_Listbox - Fatal编程技术网

C# 列表框和WinForms应用程序

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,

我有一个windows form1应用程序。此表单1有一个单击按钮。单击按钮时,将在click button方法中创建一些事件处理程序。在SendText事件处理程序方法中,我创建并显示第二个Form2,在其中我要打印form1中遇到的字符串值

问题在于,在我的列表框中,我只看到一个字符串,而不是全部(我连续发送字符串)。为什么?另外,当新事件处理程序到达时,不会创建和显示其他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);
}
表格2包括:

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

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
2个问题:

  • 如何在每次激活处理程序(使用线程,否?)时创建多个Form2表单

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

  • 如果可能,请提供例子


    谢谢。

    尝试将表单设置为静态

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