我有一个DataGridView。一些单元从串口接收数据:我想将数据推入单元,并让它更新底层绑定对象。
我正在尝试这样的事情:
SetValueFromSerial (decimal newValue)
{
dataGridView.CurrentCell.Value = newValue;
}
使用字符串无济于事:
dataGridView.CurrentCell.Value = newValue.ToString ();
在这两种情况下,我都没有在网格中看到任何内容,并且基础值没有变化。
我在Google上搜索并在这里搜索,但我没有找到任何内容。 (我可能错过了一些东西,也许是显而易见的东西,但我并非完全懒惰。)
答案 0 :(得分:34)
如果DataGridView
是数据绑定的,则不应直接修改单元格的内容。相反,您应该修改数据绑定对象。您可以通过DataBoundItem
:
DataGridViewRow
访问该对象
MyObject obj = (MyObject)dataGridView.CurrentRow.DataBoundItem;
obj.MyProperty = newValue;
请注意,绑定对象应实现INotifyPropertyChanged
,以便更改反映在DataGridView
答案 1 :(得分:28)
dataGridView1[1,1].Value="tes";
答案 2 :(得分:5)
如果您不想出于某种原因修改数据绑定对象(例如,您希望在网格中显示某些视图,但您不希望它作为数据源对象的一部分),您可能希望这样做:
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"; }
(只是一个愚蠢的例子)
但请记住,IT必须在DataBindingComplete中,否则值将保持空白
答案 3 :(得分:4)
你还记得refresh dataGridView吗?
datagridview.refresh();
答案 4 :(得分:4)
我遇到了同样的问题 使用sql-dataadapter来更新数据等等
以下对我很有用
mydatgridview.Rows[x].Cells[x].Value="test"
mydatagridview.enabled = false
mydatagridview.enabled = true
答案 5 :(得分:4)
我搜索了如何插入新行的解决方案以及如何像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!
注意:
希望这对你有所帮助。
答案 6 :(得分:3)
尝试这种方式:
dataGridView.CurrentCell.Value = newValue;
dataGridView.EndEdit();
dataGridView.CurrentCell.Value = newValue;
dataGridView.EndEdit();
需要写两次......
答案 7 :(得分:1)
以下作品。我可能会弄错,但添加String
值似乎与DataGridView单元不兼容(虽然我没有尝试或试过任何黑客攻击)。
DataGridViewName.Rows[0].Cells[0].Value = 1;
答案 8 :(得分:1)
如果DataGridView
填充了DataSource = x
(即数据绑定),那么您需要更改绑定数据,而不是DataGridView单元本身。
从已知行或列获取数据的一种方法是:
(YourRow.DataBoundItem as DataRowView).Row['YourColumn'] = NewValue;
答案 9 :(得分:1)
我遇到了同样的问题并解决了以下的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"的值。在我的情况下"评论"。我将此用于运行时添加的注释。
答案 10 :(得分:1)
你可以使用这个
<main>
<div data-color="yellow"></div>
<div data-color="orange"></div>
<div data-color="purple"></div>
</main>
<button>toggleLayout</button>
感谢saeed serpooshan的最后一行
答案 11 :(得分:0)
就像@Thomas所说,你要改变的元素必须实现INotifyPropertyChanged。但是,数据源也很重要。它必须是BindingList,您可以从List中轻松创建。
这是我的示例 - 数据源首先是DataTable,我将其传输到List,然后创建BindingList。然后我创建BindingSource并使用BindingList作为BindingSource的DataSource。最后,DataGridView的DataSource使用了这个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;
同样非常重要:每个类的成员setter必须调用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
答案 12 :(得分:0)
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;
}
第一次进展顺利但第二次按下它会给我错误 “指数超出范围。必须是非负数且小于集合的大小。 参数名称:索引“但是当我点击单元格时,会出现另一行,然后它适用于下一行,并继续...
答案 13 :(得分:0)
我尝试了很多方法,唯一有效的方法是UpdateCellValue:
dataGridView.Rows[rowIndex].Cells[columnIndex].Value = "New Value";
dataGridView.UpdateCellValue(columnIndex, rowIndex);
我希望能有所帮助。 =)