代码之家  ›  专栏  ›  技术社区  ›  Gqqnbig

为什么中继器返回DataRowView而不是DataRow?

  •  3
  • Gqqnbig  · 技术社区  · 8 年前
    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文档吗?

    3 回复  |  直到 8 年前
        1
  •  4
  •   Michael Liu    8 年前

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

    DataTable's IListSource implementation 退货 DefaultView 所以

    repeater.DataSource = dt;
    

    repeater.DataSource = dt.DefaultView;
    

    DefaultView的类型为 DataView

        2
  •  2
  •   Paul Smith    8 年前

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

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

    var row = e.Item.DataItem.Row;
    

    How can Convert DataRowView To DataRow in C# .

        3
  •  0
  •   Zuka Zarnadze    8 年前
    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;
    }
    
    推荐文章