我有一个从数据库中填充组合框的例程;组合第一次填充时,一切都很完美,但如果我再试一次,组合框就完全是空白的。我把它缩小到这条线:
cboThis.DataSource = cboThis.Items;
这似乎清除了组合框的Items集合......但仅当组合已经填充时才会显示。
有什么想法可以在这里发生什么?
IS 是其中一个组合的SelectedIndexChanged事件的事件处理程序,但除了第一行和最后一行代码之外,它似乎没有被调用。
这是完整的例程:
public void ComboFromDB(ComboBox cboThis, string strTable, string strField)
{
cboThis.SelectedIndex = -1;
cboThis.DataSource = null;
cboThis.Items.Clear();
string strQuery = @"SELECT ID, " + strField + " FROM " + strTable;
using (SqlConnection sqcConnection = new SqlConnection(strConnection))
{
sqcConnection.Open();
SqlCommand sqcCommand = new SqlCommand(strQuery, sqcConnection);
SqlDataReader dr = sqcCommand.ExecuteReader();
while (dr.Read())
{
cboThis.Items.Add(new ComboItem((int)dr[0], dr[1].ToString())); //this all works fine
}
}
cboThis.DataSource = cboThis.Items; //This line clears cboThis.Items...
cboThis.ValueMember = "ID";
cboThis.DisplayMember = "Display";
cboThis.SelectedIndex = -1;
}
干杯
答案 0 :(得分:1)
尝试创建一个像这样的结构
struct tmpItems
{
//member variables
private Int32 _ID;
private String _Display;
//properties
public Int32 ID
{
get {return _ID;}
}
public String Display
{
get {return _Display;}
}
public tmpItems(Int32 pID , String pDisplay)
{
_ID = pID;
_Display = pDisplay;
}
}
现在分配
ArrayList dataItems = new ArrayList();
dataItems.Add(new tmpItems((int)dr[0], dr[1].ToString()));
然后终于设置
cbothis.DataSource = dataItems;
cboThis.ValueMember = "ID";
cboThis.DisplayMember = "Display";
确保ComboBox SelectedIndexChange事件处理数据的初始化。 因为在设置数据源时,项目将逐个添加..每次生成SelectedIndexChangeEvent ..但在此阶段将难以访问SelectedValue属性
答案 1 :(得分:-1)
最后,我使用Items进行了分类,然后将其推送到字典中。