我正在用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;
答案 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事件。