- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我有一个 DataGridViewComboBoxColumn
填充绑定(bind)值,如果我设置 DisplayMember
属性,我得到 DataError
使用 FormatException
引发的事件:
DataGridViewComboBoxCell value is not valid
如果 DisplayMember
未设置,因此 View 显示 .ToString()
的结果,所有工作均按预期进行。
这是一个完整的例子:
public partial class Form1 : Form
{
public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{
var categories = new[] { CustomerCategory.Cat1, CustomerCategory.Cat2, CustomerCategory.Cat3 };
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
this.dataGridView1.CellParsing += new DataGridViewCellParsingEventHandler(dataGridView1_CellParsing);
this.dataGridView1.Columns.Add(new DataGridViewComboBoxColumn()
{
DataSource = categories,
HeaderText = "Category",
DataPropertyName = "Category",
DisplayMember = "Name" // if we omit this line, there is not DataError event raised
});
this.dataGridView1.DataSource = new[]
{
new Customer() { Category = CustomerCategory.Cat1 }
, new Customer() { Category = CustomerCategory.Cat2 }
, new Customer() { Category = CustomerCategory.Cat3 }
}.ToList();
}
void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
var value = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
var type = value != null ? value.GetType() : null;
string message = "Error"
+ Environment.NewLine + " - Column : " + e.ColumnIndex
+ Environment.NewLine + " - Line : " + e.RowIndex
+ Environment.NewLine + " - Value : " + Convert.ToString(value) + " (" + type + ")"
+ Environment.NewLine + " - Exception : " + e.Exception.Message;
Debug.Fail(message);
}
void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
//http://stackoverflow.com/questions/631126/how-to-bound-a-datagridviewcomboboxcolumn-to-a-object
if (this.dataGridView1.CurrentCell.OwningColumn is DataGridViewComboBoxColumn)
{
var editingControl = (DataGridViewComboBoxEditingControl)this.dataGridView1.EditingControl;
e.Value = editingControl.SelectedItem;
e.ParsingApplied = true;
}
}
}
模型:
public class CustomerCategory
{
public static readonly CustomerCategory Cat1 = new CustomerCategory { Name = "Cat1" };
public static readonly CustomerCategory Cat2 = new CustomerCategory { Name = "Cat2" };
public static readonly CustomerCategory Cat3 = new CustomerCategory { Name = "Cat3" };
public string Name { get; set; }
public override string ToString() { return this.Name; }
}
public class Customer { public CustomerCategory Category { get; set; } }
如何指定我自己的 DisplayMember
而不会引发这个烦人的 DataError
事件?
该问题仅出现在 DataGridViewComboBoxColumn
中,而不出现在常规 ComboBox
中。 .
编辑:经过几次测试,我可以这样说:
[DisplayMember + Not ValueMember] = FAIL
[Not DisplayMember + ValueMember] = FAIL
[DisplayMember + ValueMember] = WIN
所以我的问题可以改写为:是否有任何文档可以准确解释什么有效,什么无效?以及 DisplayMember
+ ValueMember
是如何链接在一起的?
重新编辑:
一个有趣的引用:Problems with the DataGridViewComboBoxColumn
However, the DataGridViewComboBoxColumn doesn't work like this, although it will display the ToString value if you don't set the DisplayMember, something internally goes wrong when it tries to look up the SelectedItem, you have to set DisplayMember to a public property of your class. Even worse, the default behaviour if you don't set the ValueMember property is to return the DisplayMember, there's no way of getting actual item itself. The only work around is to add a property to your class that returns itself and set that property to the ValueMember. Of course, if your item isn't something you are able to change (such as one of the framework classes) you'll have to cludge together a container object that holds a reference to your item.
是否有人有关于内部出现问题部分的任何信息?
最佳答案
以下逻辑可能会帮助您解决问题。
我认为问题出在代码行的顺序上。在分配显示成员属性后分配数据源可能会导致错误。
改变这一行;
this.dataGridView1.Columns.Add(new DataGridViewComboBoxColumn()
{
DataSource = categories,
HeaderText = "Category",
DataPropertyName = "Category",
DisplayMember = "Category" // if we omit this line, there is not DataError event raised
});
DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn();
col.HeaderText = "Category";
col.DataSource = categories;
col.DisplayMember = "Category";
col.DataPropertyName = "Category";
this.dataGridView1.Columns.Add(col);
数据源必须在 DisplayMember 和 ValueMember 之前赋值。
关于c# - 设置 DisplayMember 后 DataGridViewComboBoxColumn 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861381/
我有一个列表框,其中绑定(bind)了一个数据表。数据表有两列,“CMM”和“位置”。 “CMM”是一个/两位整数,用作列表框的 DisplayMember,“Location”是一个一位整数,等于
假设我正在使用这样的数据绑定(bind): List Entities = entityBinding.DataSource = Entities; lstEntities.DisplayMembe
我正在尝试获取一个 ListBox 来显示 Accommodation 表的多行的串联。 因为我无法编辑数据源,所以我准备了一个类 AccommodationEntity,它包含原始的 Accommo
我在 Windows 窗体上有一个组合框,我试图用客户端列表填充它。我有一个包含三个值的元组列表 ( var clients = new List>(); ) 我正在从返回 clientID 的 SQ
我使用 Windows 窗体。我想要来自基类的 DisplayMember 相等属性?我有课 public class MyViewModel { public int Id { get; s
我需要在一个组合框中显示多条数据,但我不知道该怎么做。 这是我正在努力工作的代码: innerBox.DisplayMember = @"t => t.TenantName + ""\
我有一个正在填充的 ComboBox,其中 ComboBox.Items 中的每个对象都是一个对象列表。目前,ComboBox 为每个项目显示“(Collection)”。 是否可以让 ComboBo
这个问题涉及一个极小的 Winforms GUI。让大家知道我具有数据绑定(bind)和 INotifyPropertyChanged 的基本知识,并且在 WPF 的 ViewModel 中使用了
我有这个方法可以将 Conta 实例添加到名为“comboContas”的 ComboBox 中: public void AdicionaConta(Conta novaConta) { c
我将 DatagridViewComboBoxColumn 绑定(bind)到数据源,我想在列表和显示成员中显示“名字”+“姓氏”。我该怎么做? 最佳答案 向公开“名称”的数据源添加一个属性。让“姓名
我目前对 C# 还很陌生,我的大部分知识都来自 Java 和 Python。话虽如此,我目前有以下代码: public class Person { public int Person_ID
我正在尝试做一些非常简单的事情 - 将 CheckedListBox 绑定(bind)到对象列表。 Class definition namespace Models { public cla
我的选中列表框有问题。 public void GetFolder() { var dict = new Dictionary(); foreach (Fo
如何设置这些值?我有一个数据表,其中包含我想在组合框中设置的所有数据,但我找不到如何设置它。 我试过了 ComboBox1.DataSource = dataTable; ComboBox1.Valu
当我设置 DataSource在控件上并想使用 .ToString()作为DisplayMember , 我需要设置 DisplayMember最后一个或 ValueMember将覆盖它。 MSDN
目的是将列表视为“名称”列表。 这是字典: class Scripts { public Dictionary scripts = new Dictionary();
我正在尝试将 Windows 窗体项目中 ListBox 的 DisplayMember 属性设置为我绑定(bind)到的通用列表中的嵌套类的属性。 这是一个简单的例子: public class
我尝试在我的 ListBox 组件中将“FirstName”和“LastName”属性显示在同一行,例如“SMITH Robert”,但是当我启动程序时,我有 Id 属性。问题可能是程序没有找到属性“
我正在尝试使用以下代码更改组合框的显示方式: private void UpdateMapRoadPointList(List plstMapRoadPointList) {
当我有一个 DataGridViewComboBoxColumn填充绑定(bind)值,如果我设置 DisplayMember属性,我得到 DataError使用 FormatException 引发
我是一名优秀的程序员,十分优秀!