如何在C#中从另一个表单向列表框添加项目

时间:2014-06-03 01:29:18

标签: c# sql winforms listbox

我正在用C#创建一个简单的注册系统,而且我已经陷入了必须定义场地/房间列表的地方。我尝试了所有其他类似的代码,但似乎没有任何工作。

以下是该方案:

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

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

 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的代码如下(表1):

 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;

1 个答案:

答案 0 :(得分:1)

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

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

尝试更改:

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

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

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