C# 从第二个表单向列表框添加项

C# 从第二个表单向列表框添加项,c#,listbox,C#,Listbox,我正在尝试从另一个表单向列表框添加项目。Form1有一个带有“虚拟”项的列表框,当我尝试从该表单添加更多项时,一切正常。但是,当我尝试从其他表单(AddContact.cs)添加项目时,没有添加任何项目。我将提供两种形式的代码 PS:列表框设置为public,以便能够从Form1外部访问它 表格1: public Form1() { InitializeComponent(); } private void Form1_Load(object se

我正在尝试从另一个表单向列表框添加项目。Form1有一个带有“虚拟”项的列表框,当我尝试从该表单添加更多项时,一切正常。但是,当我尝试从其他表单(AddContact.cs)添加项目时,没有添加任何项目。我将提供两种形式的代码

PS:列表框设置为public,以便能够从Form1外部访问它

表格1:

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        list_names.Items.Add("Dummy");
    }

    private void btn_check_Click(object sender, EventArgs e)
    {
        if (list_names.SelectedItem == null)
        {
            MessageBox.Show("No item has been selected.", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        else if (list_names.SelectedItem.ToString() == "Dummy")
        {
            //Dummy code for testing
            MessageBox.Show("Dummy has been selected!");
        }
    }

    private void btn_add_Click(object sender, EventArgs e)
    {
        new AddContact().Show();
    }

    private void btn_remove_Click(object sender, EventArgs e)
    {
        //TODO: Remove items from listbox
    }
添加联系人:

    Form1 form;

    public AddContact()
    {
        InitializeComponent();
        form = new Form1();
    }

    private void btn_add_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == string.Empty)
        {
            MessageBox.Show("No input has been given.");
        }
        else
        {
            //This doesn't work
            string s = textBox1.Text;
            form.list_names.Items.Add(s);
            textBox1.Text = "";
        }
    }
Form1 form;

public AddContact(Form1 f)
{
    InitializeComponent();
    form = f;
}

private void btn_add_Click(object sender, EventArgs e)
{
    if (textBox1.Text == string.Empty)
    {
        MessageBox.Show("No input has been given.");
    }
    else
    {
        string s = textBox1.Text;
        form.list_names.Items.Add(s);
        textBox1.Text = "";
    }
}

问题是您在
AddContact
中创建新表单时,需要引用
Form1

Form1 form;

public AddContact(Form1 frm)
{
    InitializeComponent();
    form = frm;
}
而且

private void btn_add_Click(object sender, EventArgs e)
{
    new AddContact(this).Show();
}

好的,您在AddContact构造函数中初始化Form1,这就是问题所在

试试这个:

添加联系人:

    Form1 form;

    public AddContact()
    {
        InitializeComponent();
        form = new Form1();
    }

    private void btn_add_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == string.Empty)
        {
            MessageBox.Show("No input has been given.");
        }
        else
        {
            //This doesn't work
            string s = textBox1.Text;
            form.list_names.Items.Add(s);
            textBox1.Text = "";
        }
    }
Form1 form;

public AddContact(Form1 f)
{
    InitializeComponent();
    form = f;
}

private void btn_add_Click(object sender, EventArgs e)
{
    if (textBox1.Text == string.Empty)
    {
        MessageBox.Show("No input has been given.");
    }
    else
    {
        string s = textBox1.Text;
        form.list_names.Items.Add(s);
        textBox1.Text = "";
    }
}
和添加按钮:

private void btn_add_Click(object sender, EventArgs e)
{
    new AddContact(this).Show();
}

一个小的变通方法是eventhandler

只需派生您自己的事件参数

public class AddItemEventArgs : EventArgs
{
    public string Item { get; set; } 
}
并将此代码添加到AddContanct表单:

public event EventHandler OnAddItemNeeded(object sender, AddItemEventArgs);
btn\u添加\u中单击
方法,您必须触发此事件:

this.OnAddItemNeeded(this, new AddItemEventArgs() { Item = textBox1.Text });
在Form1中调用AddContact的新实例时:

AddContact ac = new AddContact();
ac.OnAddItemNeeded += new EventHandler(this.OnAddItemNeeded);
ac.Show();
以及在Form1中执行工作的处理程序:

AddContact ac = new AddContact();
ac.OnAddItemNeeded += new EventHandler(this.OnAddItemNeeded);
ac.Show();
private void OnAddItemNeeded(object sender, AddItemEventArgs e)
{
    list_names.Items.Add(e.Item);
}
公共部分类表单1:表单
{
公共静态列表lst=新列表();
私有void Form1\u加载(对象发送方、事件参数e)
{
如果(lst!=null)
listBox1.DataSource=lst;
}
}
公共部分类表单2:表单
{
私有无效按钮1\u单击(对象发送者,事件参数e)
{             
Form1.lst.Add(textBox1.Text);
textBox1.Text=string.Empty;
}
} 

只是为了了解:由于:Form1 form;public AddContact(Form1-frm){InitializeComponent();form=frm;}两个表单代码都写在一起,请在使用时将它们分开。