【问题标题】:How to add items to a listbox from another form in C#如何在 C# 中将项目从另一个表单添加到列表框
【发布时间】:2014-07-23 05:37:45
【问题描述】:

我正在用 C# 创建一个简单的注册系统,但我被困在必须定义场地/房间列表的地方。我尝试了所有其他类似的代码,但似乎没有任何效果。

这是场景:

我有一个名为enrollmentAdmin 的表单中的btnAddRooms 按钮和一个LBoxVenue 列表框,其中有一个列表的datasource(来自数据库)。每当单击btnAddRooms 时,都会显示另一个表单,其中包含一个文本框,以便将项目添加到列表框中(btnAdd 将键入的字符串添加到文本框中)。

enrollmentAdmin(第一种形式)代码如下:

 public partial class enrollmentAdmin : Form
    {
        public List<String> listRooms = new List<String>();

 private void enrollmentAdmin_Load(object sender, EventArgs e)
        {  

            Connection.OpenConnection();

            string query1 = "select distinct Venue from tblVenueListing;";
            SqlCommand command1 = new SqlCommand(query1, Connection.conn);

            using (SqlDataReader reader = command1.ExecuteReader())
            {
                while (reader.Read())
                {
                    listVenue.Add(reader.GetString(0));
                }

            }
            Connection.CloseConnection();

            LBoxRooms.DataSource = listRooms;
        }
    }

btnAddRooms的代码如下(表格一):

 form2 form = new form2();
 form.Show();
 this.Hide();

而 btnAdd 代码(在表格 2 下):

enrollmentAdmin form1 = new enrollmentAdmin();

Connection.OpenConnection();
string insertRoom = "insert into tblVenueListing values ('" + txtVenue.Text     + "','" + txtRoom.Text + "');";
SqlCommand insert = new SqlCommand(insertRoom, Connection.conn);
insert.ExecuteNonQuery();

form1.listRooms.add(txtVenue.Text);

form1.LBoxRooms.DataSource = null;
form1.LBoxRooms.DataSource = form1.listRooms;

添加的项目不会在我添加项目后立即弹出,我仍然需要重新加载 form1 才能显示项目。

感谢任何帮助!谢谢!

编辑:找到解决方法,以便将更改立即显示到 UI 中。

我将列表变成了一个 BindingList,将其声明为静态并通过表单的名称而不是在 form2 上创建的对象实例来访问它。

所以而不是:

form1.listRooms.add(txtVenue.Text);

form1.LBoxRooms.DataSource = null;
form1.LBoxRooms.DataSource = form1.listRooms;

我做到了:

enrollmentAdmin.listRooms.add(txtVenue.Text);

form1.LBoxRooms.DataSource = null;
form1.LBoxRooms.DataSource = enrollmentAdmin.listRooms;

【问题讨论】:

    标签: c# sql winforms listbox


    【解决方案1】:

    如果您希望看到数据绑定容器更改立即反映到 UI 元素,则需要使用 BindingList 或 ObservableCollection 之类的东西或其他实现 INotifyCollectionChanged 的​​容器。使用标准 List,ListBox 不知道发生了任何变化。

    将您的列表更改为 BindingList 或 ObservableCollection 并重试。 List 不会反映它对绑定到它的 UI 元素的更改,因此如果您使用列表,则必须刷新元素或重新绑定它。但是不要那样做,首先要使用正确的容器。

    尝试改变:

    public List<String> listRooms = new List<String>();
    

    到

    public BindingList<String> listRooms = new BindingList<String>();
    

    另一个问题取决于 Form.Load 事件。它只会在第一次显示(加载)表单之前触发,并且应该像构造函数一样使用。实际上我现在更多地使用构造函数。如果您希望在每次激活表单时触发事件,请尝试 Form.Activated 事件。

    【讨论】:

    • UI 中的更改仍然不会立即显示。我已经尝试将列表更改为绑定列表,但我仍然需要重新加载 form1。我也以其他形式遇到过这个问题。 :O @mrjoltcola
    • 可能是因为 Form.Load 事件只触发一次。
    • 发现问题了!我尝试将 BindingList listRooms 声明为静态,并使用类名enrollmentAdmin 从form2 访问它,而不是使用创建的对象实例。因此,我尝试将其更改为enrollmentAdmin.listRooms.add(txtVenue.Text) 而不是form1.listRooms.add(txtVenue.Text),并立即显示更改。您的评论在某种程度上有所帮助,因为我必须将我的列表设为 BindingList 才能立即显示更改。谢谢! @mrjoltcola
    • 嗯,好的。请注意,使用静态您只能将该表单用于单个列表实例。如果这适用于您的应用程序,那么可以,但您可能应该重新考虑它。也许添加一个构造函数,以便表单在 listRooms 中传递给新表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2012-10-14
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多