繁体   English   中英

将列表列表绑定到 DataGridView

[英]Binding List of Lists to DataGridView

对于我当前的问题,我想创建一个 DataGridView 并使用对象列表作为数据源。

我遇到的问题是对象本身包含两个列表,它们应该填充 combobox 列。 DataGridView 应该包含三列,每一列对应于我下面的示例 object。 第一列是简单的文本列,而另外两列是组合框列。

目前我收到错误:

System.ArgumentException:值 DataGridViewComboBoxCell 无效。

我一直在寻找关于 SO 的其他解决方案,但似乎无法正确解决。

    public class SampleObject
    {
        public SampleObject(string name, IList<TimeSpan> startTimes, IList<Activity> completedActivities)
        {
            this.Name = name;
            this.StartTimes = startTimes;
            this.CompletedActivities = completedActivities;
        }

        public string Name { get; }

        public IList<TimeSpan> StartTimes { get; }

        public IList<Activity> CompletedActivities { get; }
    }

活动 object:

    public class Activity
    {
        public Activity(string activityName)
        {
            ActivityName = activityName;
        }

        public string ActivityName { get; }

        public override string ToString()
        {
            return ActivityName;
        }
    }

以及将列添加到我的网格的代码:

private void FillGrid()
    {
        sampleGrid.AutoGenerateColumns = false;

        var columnName = new DataGridViewTextBoxColumn
        {
            DataPropertyName = nameof(SampleObject.Name),
            HeaderText = "Name",
            Width = 160,
            ReadOnly = true
        };
        sampleGrid.Columns.Add(columnName);

        var columnStartTimes = new DataGridViewComboBoxColumn()
        {
            ValueType = typeof(TimeSpan),
            HeaderText = "StartTimes",
            Width = 120,
            ReadOnly = false
        };
        sampleGrid.Columns.Add(columnStartTimes);

        var columnCompletedActivities = new DataGridViewComboBoxColumn
        {
            ValueType = typeof(Activity),
            HeaderText = "Completed activities",
            Width = 120,
            ReadOnly = false

        };
        sampleGrid.Columns.Add(columnCompletedActivities);
    }

并填充网格:

List<SampleObject> myObjects = GetSampleObjectsBasedOnValue(value);

sampleGrid.DataSource = myObjects;

FillComboBoxesInDGV(myObjects);

填充组合框的方法:

        private void FillComboBoxesInDGV(IList<SampleObject> sampleObjects)
        {
            for (int i = 0; i < sampleObjects.Count; i++)
            {
                DataGridViewRow row = sampleGrid.Rows[i];

                var firstBox = row.Cells[1] as DataGridViewComboBoxCell;
                firstBox.DataSource = sampleObjects[i].StartTimes;

                var secondBox = row.Cells[2] as DataGridViewComboBoxCell;
                secondBox.DataSource = sampleObjects[i].CompletedActivities;
            }
        }

我仍然不确定您为什么不保留原始的IList<string> CompletedActivities而不是引入Activity class? 以这种方式使用列表在我的测试中有效。

但是,由于您确实使用了 class Activity ,我认为它会按预期工作。 但是,我遇到了您描述的相同问题。 经过一番拉扯(而且我没有太多),我从 SO 帖子中找到了一些帮助...... DataGridViewComboBoxCell 绑定 - “值无效” ......这对我来说并不明显,我猜你也是,认为覆盖Activity类的ToString方法就足够了。 显然情况并非如此。

似乎将DataGridViewComboBoxColumnsValueMember属性设置为Activity class 中的属性名称应该可以消除该错误。

var columnCompletedActivities = new DataGridViewComboBoxColumn {
    HeaderText = "Completed activities",
    ValueMember = "ActivityName",
    Width = 120,
};
sampleGrid.Columns.Add(columnCompletedActivities);

我希望这对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM