具有标签的 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&lt;string&gt;吗?因为问题中没有任何内容表明它是List&lt;string&gt;...(另外:这些天您应该使用DataTable 的次数几乎,但不完全为零;同上BinaryFormatter 来自[Serializable]) 嗨!发生异常,因为row.TagNull 【参考方案1】:

DataGridViewRow.Tagnull,因为你没有设置任何东西。您的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,每个组件在选择指示器上显示标签

具有属性绑定的自定义 UserControl 模板

具有 AccessoryType 的自定义 UITableViewCell 打破了约束

具有动态高度的自定义视图作为 UITableView 标题 ios xcode