[英]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
方法就足够了。 显然情况并非如此。
似乎将DataGridViewComboBoxColumns
的ValueMember
属性设置为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.