gpt4 book ai didi

c# - 将Datagridview的DataSource转换成List?

转载 作者:太空狗 更新时间:2023-10-30 00:54:21 25 4
gpt4 key购买 nike

我正在尝试编写一个将 datagridview 的数据源转换为列表的通用函数(然后我想向列表中添加一个空对象。数据源可以是任何类型)?

我的一些绝望尝试看起来像这样:

Type datagrid_type = dgv.DataSource.GetType();
List<object> the_source = dgv.DataSource as List<object>;
Convert.ChangeType(the_source, datagrid_type);
Object c = Activator.CreateInstance(datagrid_type);
Convert.ChangeType(c, datagrid_type);
the_source.Add(c);

..但是 the_source 只是空的。即使不是,它仍然可能无法正常工作。我相信你们会有更聪明的方法(实际有效的方法……)来实现这一目标。

附注我正在使用 EF 创建一个作为数据源的列表,因此将数据源转换为 DataTable 在这里可能不相关

最佳答案

我是通过以下方式完成的(仅在使用绑定(bind)数据源时有效)

创建自定义datagridview控件并继承datagridview

public partial class MyGridView : DataGridView

声明一个包含列名、摘要值和要显示的格式的类

    [Serializable]
public class SummaryDataProperty
{
public string ColumnName { get; set; }
public string Format { get; set; }
internal decimal Value { get; set; }
}

在您的 MyDataGridView 中声明摘要数据属性列表

    public List<SummaryDataProperty> SummaryDataPropertyNames { get; set; }

数据绑定(bind)完成后,计算摘要并将其显示在列标题处。

  protected override void OnDataBindingComplete(DataGridViewBindingCompleteEventArgs e)
{
base.OnDataBindingComplete(e);
if (SummaryDataPropertyNames.Count > 0)
{
if (DataSource is BindingSource)
{
var ds = (DataSource as BindingSource);
foreach (var prop in SummaryDataPropertyNames)
{
prop.Value = 0;
var col = this.Columns[prop.ColumnName];
foreach (var l in ds.List)
{
decimal val;
if (decimal.TryParse(Convert.ToString(l.GetType().GetProperty(col.DataPropertyName).GetValue(l, null)), out val))
prop.Value += val;
}
col.HeaderText = col.HeaderText.Split('[')[0].TrimEnd(' ') + " [" + prop.Value.ToString(prop.Format) + "]";
}

}
}
}

因为绑定(bind)数据源给出了来自数据源的对象列表。很容易遍历绑定(bind)源列表。我不知道如何使用对象数据源或 BindingDatasource.Current 执行此操作。我仍在寻找解决方案。

关于c# - 将Datagridview的DataSource转换成List?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13236962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com