具有标签的 DataRows 的自定义 DataTable
Posted
技术标签:
【中文标题】具有标签的 DataRows 的自定义 DataTable【英文标题】:Custom DataTable with DataRows that are have Tags 【发布时间】:2019-08-09 13:14:31 【问题描述】:可以通过 Tag 属性将对象绑定到 DataGridView 的 DataGridViewRow:
var row = (DataGridViewRow)dataGridView1.RowTemplate.Clone();
row.Tag= new SomeClass();
但是如何不使用(DataGridViewRow)dataGridView1.RowTemplate.Clone()
,而是使用DataTable
进行一些绑定?
我已经用public object Tag get; set;
自定义了MyDataRow
:
[Serializable]
public class MyDataRow : DataRow
public object Tag get; set;
public MyDataRow()
: base(null)
public MyDataRow(DataRowBuilder builder)
: base(builder)
还有MyDataTable
:
[Serializable]
public class MyDataTable : DataTable
public MyDataTable()
: base()
public MyDataTable(string tableName)
: base(tableName)
public MyDataTable(string tableName, string tableNamespace)
: base(tableName, tableNamespace)
/// <summary>
/// Needs using System.Runtime.Serialization;
/// </summary>
public MyDataTable(SerializationInfo info, StreamingContext context)
: base(info, context)
protected override Type GetRowType()
return typeof(MyDataRow);
protected override DataRow NewRowFromBuilder(DataRowBuilder builder)
return new MyDataRow(builder);
之后我正在尝试填充数据:
MyDataTable dt = new MyDataTable();
MyDataRow dr = dt.NewRow() as MyDataRow;
dr.Tag = new SomeObject();
var arr = columns2.ToArray();
for (int x = 0; x < arr.Length; x++)
dr[x] = arr[x];
dt.Rows.Add(dr);
dataGridView1.DataSource = dt;
结果,DataGridView1 行中没有 Tag 值
private void DataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
var row = dataGridView1.Rows[e.RowIndex];
var l = (List<string>)row.Tag; // <-- Here is Exception occures, because row.Tag comes Null
如何使用 DataSources 为 DataGridView 传递行的标记值?
【问题讨论】:
“发生异常” - 究竟是什么意思,异常类型是什么?它是无效的强制转换异常吗?如果是这样... 是.Tag
是什么? 实际上是List<string>
吗?因为问题中没有任何内容表明它是List<string>
...(另外:这些天您应该使用DataTable
的次数几乎,但不完全为零;同上BinaryFormatter
来自[Serializable]
)
嗨!发生异常,因为row.Tag
来Null
【参考方案1】:
DataGridViewRow
的.Tag
是null
,因为你没有设置任何东西。您的MyDataRow
本身具有.Tag
的事实是不相关且不相关的——完全不同的.Tag
。一种选择是设置实际DataGridViewRow
的.Tag
。
您可能想要做的是查看该行的.DataBoundItem
;这应该是您的MyDataRow
实例,但是:可能这实际上是DataRowView
,在这种情况下您需要查看@ 987654332@ 那个。
【讨论】:
【参考方案2】:您可能希望将单独的列用于“标记”目的:
class EventsDataTable : DataTable
public DataColumn ColumnVariables get; set;
public DataColumn ColumnSource get; set;
public EventsDataTable()
ColumnSource = new DataColumn("Source", typeof(string),
null, MappingType.Element);
base.Columns.Add(ColumnSource);
ColumnVariables = new DataColumn("Variables", typeof(EventData),
null, MappingType.Hidden);
base.Columns.Add(ColumnVariables);
然后你可以添加行并设置一个“原始”指针指向你的假列:
public void AddNewEvent(EventData eventData)
DataRow dataRow = _eventsTable.NewRow();
dataRow[_eventsTable.ColumnSource.ColumnName] = eventData.Source;
dataRow[_eventsTable.ColumnVariables.ColumnName] = eventData;
_eventsTable.Rows.Add(dataRow);
【讨论】:
以上是关于具有标签的 DataRows 的自定义 DataTable的主要内容,如果未能解决你的问题,请参考以下文章
为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题
具有三个组件的自定义 UIPickerView,每个组件在选择指示器上显示标签