Обновить только одну ячейку в представлении данных - PullRequest
0 голосов
/ 10 декабря 2018

Я пишу окно просмотра, которое получает данные из Serial Port и показывает переменную информацию / значение в DataGridView.У меня есть Timer Event, который срабатывает каждые 500 мс и обновляет столбец Значение для каждой строки.Пользователь может выбрать Данные Тип из ComboBox и таким образом он / она может наблюдать фактическое значение, преобразованное из значения строки переменной.

enter image description here Когда я нажимаю 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 из другого потока?

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