В данной небольшой статье рассмотрим практический пример привязки элемента ListBox к таблице данных sql-server используя непосредственный объект чтения записей таблицы - SqlDataReader. В одной из прошлых статей мы поговорили о вариантах раскрашивания элементов ListBox. В данной же сосредоточимся на самой процедуре заполнения данного контрола. О том, как выполнять заполнение ListBox из xml-файла рассказывается в статье.
Немного пояснений.
Необходимо из представленной ниже таблицы выбрать записи и их определенными полями заполнить контрол ListBox:

В нашем случае таблица имеет всего два поля, хотя это не имеет никакого значения.
string connectionString = "MyConnectionString";
SqlConnection cn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable", cn);
MyListBox.Items.Clear();
cn.Open();
SqlDataReader dataReader = cmd.ExecuteReader();
if (dataReader.HasRows)
{
MyListBox.BeginUpdate();
while (dataReader.Read())
{
MyListBox.Items.Add(dataReader.GetString(1));
}
MyListBox.EndUpdate();
}
Dr.Close();
В начале мы настроили объекты соединения и команды выборки. Затем, используя объект SqlDataReader, заполняем данными из полученных записей элементы ListBox. Обязательно перед началом заполнения контрола необходимо его почистить, иначе новые элементы просто добавятся к уже существующим.
Примечательным является строка MyListBox.BeginUpdate();
Дело в том, что используя метод BeginUpdate мы повышаем производительность при добавлении новых элементов в ListBox, запрещая перерисовку в элементе управления вплоть до вызова метода EndUpdate. Таким образом, наш контрол отрисуется ТОЛЬКО после завершения наполнения его элементами. Естественно для выполнения отрисовки всех элементов контрола мы вызываем метод MyListBox.EndUpdate();
Для избежания необходимости управления режимом добавления элементов в ListBox, правильнее было бы ридером предварительно наполнить записями из таблицы некоторый массив, а уж потом весь этот массив передать в метод MyListBox.Items.AddRahge(someMass).
Если же мы хотим наблюдать в элементах ListBox значения первичного ключа, то строку
MyListBox.Items.Add(dataReader.GetString(1));
меняем на
MyListBox.Items.Add(dataReader.GetGuid(0));
Кроме данного подхода, для автоматического заполнения ListBox мы можем использовать коллекции. Остановимся на обычном ArrayList, хотя это не принципиально. Создадим метод, возвращающий коллекцию записей ArrayList, содержащую записи типа DbDataRecord:
public ArrayList GetData()
{
...
ArrayList allData = new ArrayList();
SqlDataReader dataReader = cmd.ExecuteReader();
if (dataReader.HasRows)
{
foreach (DbDataRecord rezult in dataReader)
{
allData.Add(rezult);
}
}
return allData;
}
Теперь, где-нибудь в коде следует привязать наш ListBox к данной коллекции:
ArrayList allData_ = GetData();
MyListBox.DataSource = allData_;
Но, главное теперь для MyListBox назначить свойства для отображения значения элементов и их реальных данных:
MyListBox.DisplayMember = "Name";
MyListBox.ValueMember = "ID";
Таким нехитрым образом мы назначили для ListBox поля из таблицы БД для отображения данных в элементах контрола и их реальных значений для простого дальнейшего манипулирования.