这是我的代码:
private class Person
{
private string myName;
private int myValue;
public Person(string name, int value)
{
myName = name;
myValue = value;
}
public override string ToString()
{
return myName;
}
public string Name
{
get { return myName; }
set { myName = value; }
}
public int Value
{
get { return myValue; }
set { myValue = value; }
}
}
我用它来填充DataGridViewComboBoxCell,如下所示:
myDataGridViewComboBoxCell.ValueMember = "Value";
myDataGridViewComboBoxCell.DisplayMember = "Name";
myDataGridViewComboBoxCell.Items.Add(new Person("blabla", someNumber));
我现在要做的就是选择一个人:
myDataGridViewComboBoxCell.Value = someNumber;
但不断获得“价值无效” - 错误。任何想法为什么? 当我在程序中选择一个项目时,我可以看到正确的值(someNumber),因此Display和ValueMember设置正确...
答案 0 :(得分:9)
您需要将DataGridViewComboBoxColumn.Items
设置为人员列表,而不是添加到DataGridViewComboBoxColumn.DataSource
,而是设置DataGridViewComboBoxColumn.ValueType = typeof(Person)
。
应该这样做。虽然你问这个已经两个月了,但你的问题可能已经失去了它的紧迫感。
答案 1 :(得分:2)
我也遇到过这个问题。我暂时以肮脏的方式解决了这个问题。
DataGridViewComboBoxCell的Value属性必须是Items属性(或绑定的DataSource)中包含的值之一
问题是,因为我不知道是什么原因,当执行进入该单元格的DataGridView.CellFormatting
事件处理程序时,单元格的项目列表(或我尝试不手动输入项目时的数据源)被清除
我的脏修复是处理DataGridView.DataError
事件并在那时填充(再次)DataGridViewComboBoxCell.Items。
Private Sub myDataGridView_DataError(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) _
Handles dgvServicesToTransfer.DataError
'Dirty Fix
If e.ColumnIndex = myComboBoxColumn.Index Then
Dim row As DataGridViewRow = dgvServicesToTransfer.Rows(e.RowIndex)
' Fill in your DataGridViewComboBoxCell's Items here:
' ...
' ...
If allWentWell Then
' Cancel the exception
e.ThrowException = False
End If
End If
End Sub
End Class
PS:对不起VB.Net的答案,如果你有“翻译”的问题,请问。
答案 2 :(得分:0)
我有类似的问题。听起来很奇怪,我通过存储只向DataGridViewComboBoxCell.Items添加字符串来解决它。添加对象(使用ToString()很好地实现了等)导致了这些“数据错误”问题,但添加字符串工作正常。
答案 3 :(得分:-5)
尝试将enum用于您的人名
enum person
{
John,
Andy,
Sepehr
};
使用此枚举为组合框添加名称
myDataGridViewComboBoxCell.Items.Add ( person.andy.tostring(),number );
现在当你想再次设置vale时使用枚举。 tyhis将解决你的问题。
myDataGridViewComboBoxCell.Value = person.Andy.ToString() ;
记住使用 - > ToString()
!
为我工作! :)