Как программно установить значение ячейки в DataGridView? - PullRequest
37 голосов
/ 04 октября 2009

У меня есть DataGridView. Некоторые из ячеек получают свои данные от последовательного порта: я хочу поместить данные в ячейку и обновить их базовый связанный объект.

Я пытаюсь что-то вроде этого:

SetValueFromSerial (decimal newValue)
{
    dataGridView.CurrentCell.Value = newValue;
}

использование строки не помогает:

    dataGridView.CurrentCell.Value = newValue.ToString ();

В обоих случаях я ничего не вижу в сетке, и базовое значение не изменяется.

Я сделал Google и начал поиск, но ничего не нашел. (Возможно, я что-то пропустил, возможно, что-то очевидное, но я не совершенно ленивый.)

Ответы [ 14 ]

34 голосов
/ 04 октября 2009

Если DataGridView привязан к данным, вам не следует напрямую изменять содержимое ячейки. Вместо этого вы должны изменить объект с привязкой к данным. Вы можете получить доступ к этому объекту через DataBoundItem из DataGridViewRow:

MyObject obj = (MyObject)dataGridView.CurrentRow.DataBoundItem;
obj.MyProperty = newValue;

Обратите внимание, что связанный объект должен реализовывать INotifyPropertyChanged, чтобы изменение отражалось в DataGridView

28 голосов
/ 07 марта 2011
dataGridView1[1,1].Value="tes";
5 голосов
/ 23 октября 2012

Если вы по какой-то причине не хотите изменять объект, привязанный к базе данных (например, вы хотите отобразить какой-либо вид в вашей сетке, но не хотите, чтобы он был частью объекта источника данных), вы можете сделать это:

1.Добавить столбец вручную:

    DataGridViewColumn c = new DataGridViewColumn();
    DataGridViewCell cell = new DataGridViewTextBoxCell();

    c.CellTemplate = cell;
    c.HeaderText = "added";
    c.Name = "added";
    c.Visible = true;
dgv.Columns.Insert(0, c); 

2.В событии DataBindingComplete сделайте что-то вроде этого:

foreach (DataGridViewRow row in dgv.Rows)
{if (row.Cells[7].Value.ToString()=="1")
row.Cells[0].Value = "number one"; }

(просто глупый пример)

но помните, что ЭТО ДОЛЖНО быть в DataBindingComplete, иначе значение останется пустым

4 голосов
/ 30 апреля 2014

Я искал решение, как я могу вставить новую строку и Как установить отдельные значения ячеек внутри нее, как Excel. Я решил с помощью следующего кода:

dataGridView1.ReadOnly = false; //Before modifying, it is required.
dataGridView1.Rows.Add(); //Inserting first row if yet there is no row, first row number is '0'
dataGridView1.Rows[0].Cells[0].Value = "Razib, this is 0,0!"; //Setting the leftmost and topmost cell's value (Not the column header row!)
dataGridView1[1, 0].Value = "This is 0,1!"; //Setting the Second cell of the first row!

Примечание:

  1. Ранее я проектировал столбцы в режиме конструктора.
  2. Я установил для видимости заголовка строки значение false из свойства представления данных.
  3. Последняя строка важна для понимания: Когда вы непосредственно даете индекс вида данных, первое число - это номер ячейки, второе - номер строки! Запомни это!

Надеюсь, это поможет вам.

4 голосов
/ 23 января 2012

У меня была такая же проблема с sql-dataadapter для обновления данных и т. д.

у меня нормально работает следующее

mydatgridview.Rows[x].Cells[x].Value="test"
mydatagridview.enabled = false 
mydatagridview.enabled = true 
4 голосов
/ 04 октября 2009

Вы помните, чтобы обновить dataGridView?

datagridview.refresh();
3 голосов
/ 01 октября 2015

Попробуйте так:

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

Нужно написать два раза ...

1 голос
/ 03 августа 2016

в VB вы можете использовать это

Dim selectedRow As DataRowView
selectedRow = dg.Rows(dg.CurrentCell.RowIndex).DataBoundItem
selectedRow("MyProp") = "myValue"
dg.NotifyCurrentCellDirty(True)

спасибо Саиду Серпоошану за последний ряд

1 голос
/ 14 июля 2016

Я столкнулся с той же проблемой и решил ее следующим образом для VB.NET. Это .NET Framework, поэтому вы должны быть в состоянии адаптироваться. Хотел сравнить мое решение, и теперь я вижу, что никто, похоже, не решает его по-моему.

Создайте объявление поля.

Private _currentDataView as DataView

Так что цикл по всем строкам и поиск ячейки, содержащей значение, которое я знаю, находится рядом с ячейкой, которую я хочу изменить, работает для меня.

Public Sub SetCellValue(ByVal value As String)
    Dim dataView As DataView = _currentDataView

    For i As Integer = 0 To dataView.Count - 1
        If dataView(i).Row.Item("projID").ToString.Equals("139") Then
            dataView(i).Row.Item("Comment") = value
            Exit For ' Exit early to save performance
        End If
    Next
End Sub

Так что вы можете лучше понять это. Я знаю, что ColumnName "projID" равно 139. Я повторяю цикл, пока не найду его, а затем могу изменить значение "ColumnNameofCell" в моем случае "Комментарий". Я использую это для комментариев, добавленных во время выполнения.

dataview

1 голос
/ 09 марта 2015

Если DataGridView заполнено DataSource = x (т. Е. Привязано к данным), вам нужно изменить связанные данные , а не сами ячейки DataGridView.

Один из способов получить эти данные из известной строки или столбца таков:

(YourRow.DataBoundItem as DataRowView).Row['YourColumn'] = NewValue;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...