【问题标题】:How to pass listbox data from form1 to form2 with a button click如何通过单击按钮将列表框数据从 form1 传递到 form2
【发布时间】:2016-05-05 09:28:11
【问题描述】:

我有两个 Windows 窗体。我已从数据库中读取数据并将数据加载到Form1(FrmSelection) 上的Listbox1。现在我想要的是,当用户从Form1 上的Listbox1 中选择一个值并单击处理按钮时,必须在Form2(FrmProcessOrder) Listbox2 上加载所选值。我尝试了不同的示例,但无法正常工作。以下是以下步骤

1.运行应用程序

2.FrmSelection 以空列表框打开,然后单击打开 FrmSelection 的处理按钮

3.FrmSelections 打开,这个表单包含一个列表框和我从数据库中读取的数据。

4.从列表框中选择一项

5.从 FrmSelections 的列表框中选择项目后单击 Addforms 按钮。

  1. 所选项目必须出现在 FrmProcessorder 列表框中。

问题 - 当我在选择项目后单击 Addforms 按钮时,在 FrmProcessorder 表单上出现错误(对象未设置为对象的实例)

下面是我的代码..

Form1(FrmSelection)

    public partial class FrmProcessOrder : Form
{

    public FrmProcessOrder()
    {
        InitializeComponent();        
    }
    private void btnProcess_Click(object sender, EventArgs e)
    {
        Program._FrmSelection = new FrmSelection();
        Program._FrmSelection.Show();
    }

    public void AddList(ListBox _Listing)
    {
        ListBoxForms.Items.AddRange(_Listing.Items); 
    }
}

表格2(FrmProcessOrder)

   FrmProcessOrder _FrmProcessOrder;
    public FrmSelection()
    {
        InitializeComponent();

        LoadData();
    }

    //Method which reads data from the db and laod data on listview
    public void LoadData()
    {
        _connection = "Data Source=MILESTONE-PC;Initial Catalog=Jack;Integrated Security=True";
        _sql = "Select * from tblJackon";
        _conn = new SqlConnection(_connection);
        _conn.Open();

        _comm = new SqlCommand(_sql, _conn);
        _adapt.SelectCommand = _comm;
        _adapt.Fill(_dataset, _sql);
        DataTable _tbl = _dataset.Tables[0];
        _dtrow = null;

        foreach (DataRow _dataVariable in _tbl.Rows)
        {
            _dtrow = _dataVariable;
            ListBoxSelection.Items.Add((_dtrow["FormNames"]));
        }
    }

    private void btnAddForms_Click(object sender, EventArgs e)
    {
        _FrmProcessOrder.AddList(ListBoxSelection);  // It throws error on this line after select from listbox so that the item must to FrmProcessOrder listbox
        _FrmProcessOrder = new FrmProcessOrder();    
    }

【问题讨论】:

  • FrmProcessOrder 不包含采用 0 个参数的构造函数。您可以尝试移动代码以便在加载表单后加载数据吗?
  • 我已经更新了代码并添加了一些解释以使其更加清晰。
  • 你能显示错误吗?

标签: c# winforms listbox


【解决方案1】:

编辑(问题被编辑后):

检查一下:

FrmProcessOrder _FrmProcessOrder; //没有声明对象

private void btnAddForms_Click(object sender, EventArgs e)
{
    _FrmProcessOrder.AddList(ListBoxSelection);  // This is null exception
    _FrmProcessOrder = new FrmProcessOrder(); //it should not be put here
}

您的_FrmProcessOrder 在正确初始化之前已被使用。改为这样做:

FrmProcessOrder _FrmProcessOrder = new FrmProcessOrder(); //Now it is declared, only once

private void btnAddForms_Click(object sender, EventArgs e)
{
    _FrmProcessOrder.AddList(ListBoxSelection);  // Now it should be ok
}

原文:

最简单的方法之一是将您的输入作为一个字段(或创建一个方法调用来执行它)而不是作为构造函数参数。

改变这个:

public FrmProcessOrder(ListBox _List)
{
    InitializeComponent();
    ListBoxForms2.Items.AddRange(_List.Items);         
}

进入这个

public FrmProcessOrder()
{
    InitializeComponent();
}

public void AddList(ListBox _List){
    ListBoxForms2.Items.AddRange(_List.Items);         
}

那么当你需要时可以调用Form 方法

_FrmProcessOrder.AddList(listBox);

【讨论】:

  • 我必须在选择表单按钮下添加此代码(_FrmProcessOrder.AddList(listBox)?
  • @JuniorLinq 不,您需要在创建 form 后调用它。例如,如果您创建它:FrmProcessOrder _FrmProcessOrder = new FrmProcessOrder(); 在您的FrmSelection 中。然后在创建之后,在使用之前,你可以调用_FrmProcessOrder.AddList(listBox);
  • 我很困惑。 ..你能告诉我你发布的代码吗?你说的我试过了,还是不行。
  • 在 FrmSelection 上的按钮下,对象引用未设置为对象错误的实例
  • @JuniorLinq "在 FrmSelection 上的按钮下,对象引用未设置为对象错误的实例" 也许最好能显示这个新代码。
【解决方案2】:

我相信您错误地复制了代码块(交换了 Form2 和 Form1)。

Application.Run(new FrmProcessOrder()); 这一行应替换为Application.Run(new FrmSelection());,这将从数据库中加载数据。

您看到的编译错误是因为您没有空的构造函数。根据当前代码,要实例化“FrmProcessOrder”,您必须提供一个 ListBox 实例。

【讨论】:

  • 我已经更新了代码并添加了一些解释以使其更清晰。
【解决方案3】:

在这一行

Application.Run(new FrmProcessOrder());

您正在尝试实例化一个新的FrmProcessOrder,但您有一个这样的构造函数:

public FrmProcessOrder(ListBox _List)

所以你不能在没有参数ListBox 的情况下进行实例化。 如果你想要这个,你必须添加到 Form1 空构造函数:

public FrmProcessOrder()
{

}

【讨论】:

  • 我已经更新了代码并添加了一些解释以使其更加清晰。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2015-05-30
  • 2014-01-02
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多