Подтвердить что ты не робот

Как программно установить значение ячейки в DataGridView?

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

Я пробую что-то вроде этого:

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

с помощью строки не помогает:

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

dataGridView1[1,1].Value="tes";

Ответ 3

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

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

Помните refresh dataGridView?

datagridview.refresh();

Ответ 5

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

для меня отлично работает

mydatgridview.Rows[x].Cells[x].Value="test"
mydatagridview.enabled = false 
mydatagridview.enabled = true 

Ответ 6

Я искал решение, как я могу вставить новую строку и как установить отдельные значения ячеек внутри нее, как 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 value (Not the column header row!)
dataGridView1[1, 0].Value = "This is 0,1!"; //Setting the Second cell of the first row!

Примечание:

  • Раньше я проектировал столбцы в режиме разработки.
  • Я установил видимость заголовка строки как false из свойства datagridview.
  • Последняя строка важна для понимания: Когда вы прямо указываете индекс datagridview, первым номером является номер ячейки, второй - номер строки! Помните это!

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

Ответ 7

Попробуйте следующим образом:

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

dataGridView.CurrentCell.Value = newValue;

dataGridView.EndEdit();

Необходимо написать два раза...

Ответ 8

Следующие работы. Я могу ошибаться, но добавление значения String не похоже на ячейку DataGridView (я не экспериментировал и не пытался использовать какие-либо хаки).

DataGridViewName.Rows[0].Cells[0].Value = 1;

Ответ 9

Как и @Thomas, элемент, который вы хотите изменить, должен реализовать INotifyPropertyChanged. Но, источник данных также важен. Он должен быть BindingList, который можно легко создать из списка.

Вот мой пример - источник данных сначала DataTable, который я передаю в List, а затем создаю BindingList. Затем я создаю BindingSource и использую BindingList как DataSource из BindingSource. Наконец, DataSource из DataGridView использует этот BindingSource.

 sp_Select_PersonTableAdapter adapter = new sp_Select_PersonTableAdapter();

 DataTable tbl = new DataTable();
 tbl.Merge(adapter.GetData());

 List<Person> list = tbl.AsEnumerable().Select(x => new Person
 {
     Id = (Int32) (x["Id"]),
     Ime = (string) (x["Name"] ?? ""),
     Priimek = (string) (x["LastName"] ?? "")
 }).ToList();

 BindingList<Person> bindingList = new BindingList<Person>(list);

 BindingSource bindingSource = new BindingSource();
 bindingSource.DataSource = bindingList;
 dgvPerson.DataSource = bindingSource;

Что также очень важно: каждый член класса должен вызывать OnPropertyChanged(). Без этого это не сработает. Итак, мой класс выглядит следующим образом:

public class Person : INotifyPropertyChanged
    {
        private int _id;
        private string _name;
        private string _lastName;

        public int Id
        {
            get { return _id; }
            set
            {
                if (value != _id)
                {
                    _id = value;
                    OnPropertyChanged();
                }
            }
        }
        public string Name
        {
            get { return _name; }
            set
            {
                if (value != _name)
                {
                    _name = value;
                    OnPropertyChanged();
                }
            }
        }
        public string LastName
        {
            get { return _lastName; }
            set
            {
                if (value != _lastName)
                {
                    _lastName= value;
                    OnPropertyChanged();
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

    }

Подробнее об этой теме: http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

Ответ 10

private void btn_Addtoreciept_Click(object sender, EventArgs e)
{            
    serial_number++;
    dataGridView_inventory.Rows[serial_number - 1].Cells[0].Value = serial_number;
    dataGridView_inventory.Rows[serial_number - 1].Cells[1].Value =comboBox_Reciept_name.Text;
    dataGridView_inventory.Rows[serial_number - 1].Cells[2].Value = numericUpDown_recieptprice.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[3].Value = numericUpDown_Recieptpieces.Value;
    dataGridView_inventory.Rows[serial_number - 1].Cells[4].Value = numericUpDown_recieptprice.Value * numericUpDown_Recieptpieces.Value;
    numericUpDown_RecieptTotal.Value = serial_number;
}

в первый раз он идет хорошо, но нажатие второго раза дает мне ошибку "Индекс был вне допустимого диапазона. Он должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс ", но когда я нажимаю на ячейку, появляется другая строка, а затем она работает для следующей строки и продолжает...

Ответ 11

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

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

(YourRow.DataBoundItem as DataRowView).Row['YourColumn'] = NewValue;

Ответ 12

Я столкнулся с одной и той же проблемой и решил ее использовать для 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

Ответ 13

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

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

благодаря saeed serpooshan для последней строки

Ответ 14

Я пробовал много методов, и единственным, который работал, был UpdateCellValue:

dataGridView.Rows[rowIndex].Cells[columnIndex].Value = "New Value";
dataGridView.UpdateCellValue(columnIndex, rowIndex);

Я надеюсь помочь. =)