我正在编写一个监视窗口,该监视窗口从Serial Port
获取数据,并在DataGridView
中显示变量信息/值。我有一个Timer Event
,每500毫秒触发一次,并为每行更新 Value 列。用户可以从组合框选择数据类型,这样他/她就可以观察从变量的行值转换而来的实际值。
当我单击“类型”列中的ComboBox
时,将鼠标指针移到与所选 Type 不同的 Type 上,然后稍等片刻(长于500ms) ,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);
}
}
编辑:我意识到,当我尝试读取Type ComboBox的当前值时,它将读取默认值。但是,如果我尝试通过单击按钮读取当前值,它将正确读取当前值。我们是否可以假设从另一个线程访问DataTable有区别?