代码之家  ›  专栏  ›  技术社区  ›  Dusan

将列表框项目传递到另一个表单c上的文本框#

  •  0
  • Dusan  · 技术社区  · 11 年前

    我正在Visual studio中用c#制作这个简单的Windows窗体应用程序。我有两种表格。在表单1上,我有一个文本框、列表框和两个按钮(一个用于从文本框插入列表框,另一个用于打开表单2)。在表格2上,我只有一个文本框。我只是想,当点击表单1上的按钮(用于打开表单2)时,表单2打开,文本框包含(在表单上加载)表单1列表框中的选定项目。但当我点击按钮时,它会显示“对象引用未设置为对象的实例”。我做错了什么?我很确定这很简单,但我就是搞不懂。

    提前谢谢!

    这是我的代码:

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

    在表格2上:

     public partial class Form2 : Form
      {
        public Form2()
        {
            InitializeComponent();
        }
    
        private void Form2_Load(object sender, EventArgs e)
        {
            Form1 f1 = new Form1();
            textBox1.Text = f1.Transfer;
        }
    
    4 回复  |  直到 11 年前
        1
  •  2
  •   Matten    11 年前

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

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

    在表格1上:

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

    在表格2上:

    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
  •  1
  •   Mathew Collins    11 年前

    在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
  •  0
  •   Anand    11 年前

    由于您尚未选择列表框项目,值listBox1.SelectedItem为null。练习try-catch块

        4
  •  0
  •   Sergey Berezovskiy    11 年前

    您正在创建新的 Form1 实例,它与您过去打开的Form1实例无关 Form2 :

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

    你所需要的只是改变 表格2 构造函数接受此字符串:

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