Загрузка данных из базы данных в поле со списком, используя другой поток - PullRequest
2 голосов
/ 31 марта 2012

Я хочу добавить элементы в поле со списком после получения столбца из таблицы базы данных. Для достижения производительности я поместил эту задачу во вновь созданную тему

for (int i = 0; i < dataTable.Rows.Count; i++)
{
    comboBox.Items.Add(dataTable.Rows[i][0].ToString());
}

но это дает следующее исключение:

«Операция с поперечной резьбой недопустима»

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

Скажите, пожалуйста, как мне это решить?

Ответы [ 3 ]

3 голосов
/ 31 марта 2012

Просто оберните код в делегате, переданном в BeginInvoke:

comboBox.BeginInvoke(
    (Action)(() =>
    {
       for (int i = 0; i < dataTable.Rows.Count; i++)
       {
          comboBox.Items.Add(dataTable.Rows[i][0].ToString());
       }
    }));

Таким образом, вы пересылаете обновления в поток GUI, потому что это единственный поток, которому разрешено вносить изменения в GUI.

0 голосов
/ 31 марта 2012

Ваша тема не является темой пользовательского интерфейса. Только поток пользовательского интерфейса может получить доступ к элементам управления пользовательского интерфейса, как ваш комбинированный список Таким образом, ваш метод обновления элементов комбинированного списка должен проверить, вызывается ли он из потока пользовательского интерфейса, и (если нет) переключиться на него, прежде чем пытаться использовать комбинированный список.

public delegate void OnAddTable(DataTable dataTable);

private void AddTable(DataTable dataTable)
{
    if(this.InvokeRequired) 
    {
        this.BeginInvoke(new OnAddTable(AddTable), new object[] {dataTable}));
        return;
    }
    for (int i = 0; i < dataTable.Rows.Count; i++) 
    { 
        comboBox.Items.Add(dataTable.Rows[i][0].ToString()); 
    }
} 
0 голосов
/ 31 марта 2012

Вы можете (и, вероятно, должны) выполнить запрос к базе данных в фоновом потоке, но вы должны обновить элементы управления пользовательского интерфейса в потоке пользовательского интерфейса. Так работает Windows.

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