【问题标题】:Why does repeater return DataRowView instead of DataRow?为什么中继器返回 DataRowView 而不是 DataRow?
【发布时间】:2017-10-06 01:26:49
【问题描述】:
protected void Page_Load(object sender, System.EventArgs e)
{
    DataTable dt = GetDataTable("select * from AccountTypes");

    repeater.DataSource = dt;
    repeater.DataBind();
}

private void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType != ListItemType.Item) {
        return;
    }

    var row = (DataRow)e.Item.DataItem;
}

它抛出异常“无法将'System.Data.DataRowView'类型的对象转换为'System.Data.DataRow'类型。”

DataRow是DataTable的一个元素,为什么e.Item.DataItem会变成DataRowView呢?

谁能找到提到这个的 MSDN 文档?

【问题讨论】:

  • 我不确定这东西为什么会这样,也许是因为中继器产生了DataRowView 对象。显然,使用var row = ((DataRowView)e.Item.DataItem).Row; 可以解决这个问题。
  • 不确定为什么要获得 DataRowView - 这是 DataRow 的自定义版本,但您可以像这样将其用作 DataRow - stackoverflow.com/questions/17089147/…

标签: c# asp.net


【解决方案1】:

此行为由 DataTable 类定义。与典型的集合类不同,DataTable 实现 IListSource 而不是 IEnumerable。 IListSource 接口允许类“自定义”提供给数据绑定控件(如 Repeater)的数据。

DataTable's IListSource implementation 返回DefaultView,所以

repeater.DataSource = dt;

实际上等价于

repeater.DataSource = dt.DefaultView;

DefaultView 的类型是DataView,它是一个DataRowView 集合。这就是为什么您的数据项是 DataRowView 对象的原因。

【讨论】:

    【解决方案2】:

    DataRowView 封装 DataRow,添加在网络控件(如中继器)上下文中有用的绑定功能。

    如果您想与底层 Row 交互,只需使用 Row 属性,如下所示:

    var row = e.Item.DataItem.Row;
    

    这可能与How can Convert DataRowView To DataRow in C# 重复。

    【讨论】:

    • 我不是在问如何,我是在问为什么
    【解决方案3】:
    protected void Page_Load(object sender, System.EventArgs e)
    {
        DataTable dt = GetDataTable("select * from AccountTypes");
    
        repeater.DataSource = dt;
        repeater.DataBind();
    }
    
    private void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType != ListItemType.Item) {
            return;
        }
    
        var row = e.Item.DataItem;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 2015-11-02
      • 2021-09-13
      • 2017-06-30
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多