Как программно установить значение ячейки в DataGridView?
У меня есть DataGridView. Некоторые из ячеек получают свои данные из последовательного порта: я хочу перетащить данные в ячейку и обновить базовый связанный объект.
Я пробую что-то вроде этого:
SetValueFromSerial (decimal newValue)
{
dataGridView.CurrentCell.Value = newValue;
}
с помощью строки не помогает:
dataGridView.CurrentCell.Value = newValue.ToString ();
В обоих случаях я ничего не вижу в сетке, и базовое значение не изменяется.
Я сделал Google и искал здесь, но ничего не нашел. (Возможно, я что-то пропустил, возможно, что-то очевидное, но я не совсем ленив.)
Ответы
Ответ 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);
Я надеюсь помочь. =)