DataGridViewComboBoxColumn不允许我从列表中选择对象
本文关键字:选择 对象 列表 不允许 允许我 DataGridViewComboBoxColumn | 更新日期: 2023-09-27 18:12:53
我有一个DataGridView,它允许用户向列表中添加新对象。其中一个重要部分是从用户可定义的列表中选择类型。
我这样定义列:
this.DataGridView.Columns.Add(new DataGridViewComboBoxColumn
{
Name = "Resource",
DataPropertyName = "Resource",
DataSource = new BindingSource { DataSource = this.Document.Resources },
ValueType = typeof(Resource),
DisplayMember = "Name"
});
然后,我将DataGridView的DataSource设置为UserResources:列表
BindingList<UserResource> relatedResources = new BindingList<UserResource>(this.User.ResourcesRequired);
this.DataGridView.DataSource = relatedResources;
资源类布局如下:
public class Resource
{
public string Name { get; set; }
public string Description { get; set; }
public int InitialLevel { get; set; }
}
UserResource类如下所示:
public class UserResource
{
public Resource Resource { get; set; }
public int CurrentLevel { get; set;
}
User类如下所示:
public class User
{
public string Name { get; set; }
public IEnumerable<UserResource> Resources { get; set; }
}
我可以看到可用资源类型的列表,但在DataGridViewComboBoxCell中选择的项没有保持选中状态。选择项目后,当我转到下一个字段时,DataGridViewComboBoxCell会自行清除。
行中的其他字段将写入我的新UserResource实例,但Resource引用将不会保存,并且该属性在新的UserResource实例上保持为null。
如果人们想知道,我根本没有使用任何类型的对象关系映射器或任何类型的数据库层。内存中的所有对象都被写入XML文档并从中读取。
老实说,我不确定如何从这里继续调试这个问题。有人有什么建议吗?
好的,我做了一些更改。现在它一开始运行良好。将资源类更改为:
public class Resource
{
public string Name { get; set; }
public string Description { get; set; }
public int InitialLevel { get; set; }
//added by dx
public new string ToString()
{
return Name;
}
}
为网格组合框创建新类:
public class ComboSource
{
public string Name
{
get
{
if (SourceValue != null)
return SourceValue.ToString();
return string.Empty;
}
}
public Resource SourceValue{ get; set; }
}
示例用法:
private List<ComboSource> resources = new List<ComboSource>();
this.resources.Add(new ComboSource() { SourceValue = new Resource() { Name = "rs1", Description = "a"} });
this.resources.Add(new ComboSource() { SourceValue = new Resource() { Name = "rs2", Description = "b" } });
this.resources.Add(new ComboSource() { SourceValue = new Resource() { Name = "rs3", Description = "c" } });
和
this.dataGridView1.Columns.Add(new DataGridViewComboBoxColumn
{
Name = "Resource",
DataPropertyName = "Resource",
ValueMember = "SourceValue",
DataSource = new BindingSource { DataSource = this.resources },
ValueType = typeof(Resource),
DisplayMember = "Name"
});
我不认为这个控件有问题。你可以选择合适的项目。正如您所说,当您在表单上移动时,项目将被清除。
这意味着有其他源正在对此控件进行验证并决定清除它。请查找代码的其他部分或挂钩到可能正在修改所选值的更改事件。
我愿意提供更多帮助,但我需要查看完整的代码,如果你愿意分享,我的电子邮件地址就在我的个人资料中。
<telerik:DataFormComboBoxField Grid.Row="0" Grid.Column="2" Label="Time Zone:" LabelPosition="Above">
<telerik:RadComboBox SelectedValue="{Binding TimeZoneID, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
ItemTemplate="{StaticResource DataTemplateTimeZone}"
SelectedValuePath="ID"
ItemsSource="{Binding DataSource.TimeZoneDataSource, Source={StaticResource vmProxy}}"
IsEnabled="True"/>
</telerik:DataFormComboBoxField>
我建议使用一个包含可观测集合的视图模型,并使用http://weblogs.asp.net/dwahlin/archive/2009/08/20/creating-a-silverlight-datacontext-proxy-to-simplify-data-binding-in-nested-controls.aspx
就像我对StaticResource vmProxy 所做的那样