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文档并从中读取。

老实说,我不确定如何从这里继续调试这个问题。有人有什么建议吗?

DataGridViewComboBoxColumn不允许我从列表中选择对象

好的,我做了一些更改。现在它一开始运行良好。将资源类更改为:

    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 所做的那样