Я пишу окно просмотра, которое получает данные из Serial Port
и показывает переменную информацию / значение в DataGridView
.У меня есть Timer Event
, который срабатывает каждые 500 мс и обновляет столбец Значение для каждой строки.Пользователь может выбрать Данные Тип из ComboBox и таким образом он / она может наблюдать фактическое значение, преобразованное из значения строки переменной.
Когда я нажимаю ComboBox
в столбце Тип, наведите указатель мыши на другой Тип , чем выбранный Тип и затем немного подождать (дольше 500 мс), Timer Event
заставляет Combobox
автоматически переносить выбор в SelectedIndex.Мне нужно переместить мышь в другую область и вернуться к Type , который я хочу выбрать, и выбрать его до того, как событие Timer автоматически обновит его.
Я подозреваю, что я просто изменяю одну ячейку (Значение) в Timer Event
, но я думаю, она обновляет всю строку.Так что, если я не нажал на Тип, который я хочу выбрать до того, как сработает Timer Event
, он автоматически выберет текущий SelectedItem.Как я могу предотвратить обновление ComboBox, когда я просто не хочу, чтобы он обновлялся, пока я не нажму туда и не выберу один из них вручную?
Вот мои привязки DataTable
и DataGridView
:
BindingSource SBind = new BindingSource();
DataTable WatchDataTable = new DataTable();
public WatchWindowForm()
{
InitializeComponent();
initializeDataTable();
initializeConfigPanel();
}
private void initializeDataTable()
{
/* Create the DataTable with the same column properties */
WatchDataTable.Columns.Add(new DataColumn("varName"));
WatchDataTable.Columns.Add(new DataColumn("varSize"));
WatchDataTable.Columns.Add(new DataColumn("varValue"));
WatchDataTable.Columns.Add(new DataColumn("varAddress"));
WatchDataTable.Columns.Add(new DataColumn("varType"));
WatchDataTable.Columns.Add(new DataColumn("varDelete"));
/* Bind the DataTable to the DataGridview (varTable_dgv) */
SBind.DataSource = WatchDataTable;
varTable_dgv.DataSource = SBind;
}
Вот мой Timer Event
:
private void WatchTimerEvent(object sender, EventArgs e)
{
foreach(DataRow dr in WatchDataTable.Rows)
{
/* Search the database using the "Name" cell in the row
and find the corresponding local variable */
Var_t var = DataBase.LiveVariableDatabase.Find(x => x.name == dr["varName"].ToString());
/* Get the new value of the variable
and write it to the "Value" cell in the DataGridView */
dr["varValue"] = DataTypes.GetTypedVariable(var);
}
}
Редактировать: Я понял, что когда я пытаюсь прочитать текущее значение типа ComboBox, он читает значение по умолчанию,Но если я пытаюсь прочитать текущее значение с помощью нажатия кнопки , оно считывает текущее значение правильно.Можем ли мы предположить, что существует разница между доступом к DataTable из другого потока?