【问题标题】:pass listbox item to a textbox on another form c#将列表框项传递给另一个表单 c# 上的文本框
【发布时间】:2013-10-18 11:54:23
【问题描述】:

我正在用 c# 在 Visual Studio 中制作这个简单的 Windows 窗体应用程序。我有两种形式。在 form1 上,我有一个文本框、列表框和两个按钮(一个用于从文本框插入列表框,另一个用于打开 form2)。在 form2 我只有一个文本框。我只是想要,当单击form1 上的按钮(用于打开form2)时,打开form2 并包含(在formLoad 上)从form1 的列表框中选择的项目。但是当我单击按钮时,它会显示“对象引用未设置为对象的实例”。我究竟做错了什么?我很确定这很简单,但我就是不明白。

提前致谢!

这是我的代码:

在表格 1 上:

  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();
    }

    private void btnOpenForm2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2();
        f2.ShowDialog();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.Items.Add(textBox1.Text);
    }
    public string Transfer
    {
        get { return listBox1.SelectedItem.ToString(); }
    }

在form2上:

 public partial class Form2 : Form
  {
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        textBox1.Text = f1.Transfer;
    }

【问题讨论】:

    标签: c# listbox listboxitem


    【解决方案1】:

    因为在Form2_Load 事件中,您总是创建Form1 的新实例,然后访问Transfer 属性,该属性访问listBox1.SelectedItem,该属性未为新创建的表单设置。

    您应该在按钮事件中将引用传递给表单 1:

    在表格 1 上:

    private void btnOpenForm2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2(this);
        f2.ShowDialog();
    }
    

    在form2上:

    public partial class Form2 : Form
    {
       Form1 f1;
       public Form2(Form1 f1)
       {
           this.f1 = f1;
           InitializeComponent();
       }
    
       private void Form2_Load(object sender, EventArgs e)
       {
           textBox1.Text = this.f1.Transfer;
       }
    }
    

    【讨论】:

    • 这有帮助。再次感谢!
    【解决方案2】:

    在您的 Form2_Load 方法中,您正在创建对象 Form1 的新实例,与现有项目分开。

    相反,您需要: a) 将对当前 Form1 对象的引用传递给 Form2,以便 Form2 可以访问 Transfer 属性。 或 b) 向 Form2 添加一个新属性(例如称为 Transfer),然后在创建 Form2 时,将当前文本框值分配给该属性,如下所示:

    Form2 f2 = new Form2();
    f2.Transfer = listBox1.SelectedItem.ToString();
    f2.ShowDialog();
    

    您也可以通过向 Form2 的构造函数添加一个参数来做到这一点,尽管这实际上是一个设计决定。

    【讨论】:

    • 这也有帮助。谢谢
    【解决方案3】:

    因为你还没有选择你的列表框项,值 listBox1.SelectedItem 为空。练习做 try catch 块

    【讨论】:

    • 这里的问题是我们正在创建一个新的 Form1 实例,而不是使用现有的。
    • 由于 matten 已经建议了术语。所以避免重复答案我给出了另一个可能的错误。
    【解决方案4】:

    您在此处创建新的Form1 实例,它与您之前打开Form2 的Form1 实例无关:

    private void Form2_Load(object sender, EventArgs e)
    {
        Form1 f1 = new Form1(); // here is new instance of Form1 created
        textBox1.Text = f1.Transfer;
    }
    

    所以,这个新的 Form1 实例没有选中的项目,你有错误。我建议您在打开 Form2 时将选定的项目值传递给 Form2:

    private void btnOpenForm2_Click(object sender, EventArgs e)
    {
        Form2 f2 = new Form2(Transfer); // pass selected item value to constructor
        f2.ShowDialog();
    }
    

    您只需要更改 Form2 构造函数以接受此字符串:

    public Form2(string transfer)
    {
        InitializeComponent();
        textBox1.Text = transfer;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2011-07-21
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多