组合框 - 设置数据源清除项目

时间:2011-03-22 18:06:37

标签: c# data-binding combobox

我有一个从数据库中填充组合框的例程;组合第一次填充时,一切都很完美,但如果我再试一次,组合框就完全是空白的。我把它缩小到这条线:

        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;
    }

干杯

2 个答案:

答案 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进行了分类,然后将其推送到字典中。