Combobox - установка источника данных очищает элементы - PullRequest
1 голос
/ 22 марта 2011

У меня есть подпрограмма, которая заполняет комбинированный список из базы данных; при первом заполнении комбинированного списка все работает отлично, но если я попытаюсь сделать это снова, поле со списком будет полностью пустым. Я сузил это до этой строки:

        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 ]

1 голос
/ 28 апреля 2011

попытайтесь создать структуру, подобную этой

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 на данном этапе

0 голосов
/ 25 марта 2011

В конце я скомпоновал с помощью предметов и просто протолкнул его через словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...