当前位置:编程学习 > C#/ASP.NET >>

Container.DataItem是什么意思?

一般用在哪啊

<%#((DataRowView)Container.DataItem)["字段名"]%>或
<%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%>
用这两句.数据源必须是DataSet,DataTable吧? --------------------编程问答-------------------- dataset中的datatable或者datatable --------------------编程问答-------------------- 顶一下.... --------------------编程问答-------------------- Container.DataItem邦定数据,在datagrid,datalist中都有,用dataset填充数据集 --------------------编程问答-------------------- 那在别的控件中就用不了的吧.?? --------------------编程问答-------------------- Container根本不是任何一个静态的对象或方法,它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。 --------------------编程问答-------------------- Container是一个容器DataItem是属性。你可以去看看控件开发就明白了。  --------------------编程问答-------------------- GridView里面好像不能这样绑定的吧?没有DataItem属性 --------------------编程问答-------------------- 只知道他在数据邦定时用~~ --------------------编程问答-------------------- 数据绑定以及Container.DataItem的具体分析
灵活的运用数据绑定操作
绑定到简单属性:<%#UserName%>
绑定到集合:<asp:ListBox id="ListBox1" datasource='<%# myArray%>' runat="server">
绑定到表达式:<%#(class1.property1.ToString() + "," + class1.property2.ToString())%>
绑定到方法返回值:<%# GetSafestring(str) %>
绑定到Hashtable:<%# ((DictionaryEntry)Container.DataItem).Key%>
绑定到ArrayList:<%#Container.DataItem %>

若数组里里放的是对象则可能要进行必要的转换后再绑定如:
<%#((对象类型)Container.DataItem).属性%>

绑定到DataView,DataTable,DataSet:
<%#((DataRowView)Container.DataItem)["字段名"]%>或
<%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%>
要格式化则:
<%#string.Format("格式",((DataRowView)Container.DataItem)["字段名"])%>
<%#DataBinder.Eval(Container.DataItem,"字段名","格式")%>

绑定到DataReader:
<%#((IDataReader)Container.DataItem).字段名%>

当然为了方便一般使用最多的就是DataBinder类的Eval方法了.不过这样对于同时要绑定大量的数据效率要低一些

在绑定数据时经常会用到这个句程序:<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder.Eval(Container,"DataItem.xxxx")%>


DataBinder是System.Web里面的一个静态类,它提供了Eval方法用于简化数据绑定表达式的编写,但是它使用的方式是通过 Reflection等开销比较大的方法来达到易用性,因此其性能并不是最好的。而Container则根本不是任何一个静态的对象或方法,它是 ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量,其类型是可以进行数据绑定的控件的数据容器类型(如在Repeater内部的数据绑定容器叫RepeaterItem),在这些容器类中基本都有DataItem属性,因此你可以写Container.DataItem,这个属性返回的是你正在被绑定的数据源中的那个数据项。如果你的数据源是DataTable,则这个数据项的类型实际是DataRowView  --------------------编程问答--------------------
引用楼主 tqbba 的回复:
一般用在哪啊

<%#((DataRowView)Container.DataItem)["字段名"]%>或
<%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%>
用这两句.数据源必须是DataSet,DataTable吧?


从asp.net2.0开始,绑定表达是使用Eval,基本不需要使用Container.DataItem。

对于各种具有数据绑定的控件,在处理数据源的每一行数据时,首先把数据压入当前Page的一个数据堆栈中,然后这个控件的每一行的子控件再从堆栈顶取出数据(这样就绕开了需要为控件及其子控件预先设计通讯接口的责任)。因此每一行数据所看到的一个Container,其实是这个传递进来的数据项。每一个控件都把数据项包装为一个对象,例如FormView控件包装的Container就是一个FormView对象,GridView对象包装出来的是GridViewRow,ListView包装出来的是ListViewDataItem。

每一个Container是否都有DataItem属性?不一定,不要想当然。当然如果你仅使用asp.net中内置的几种控件,它们恰好都有一个DataItem属性,所以这似乎没有多大问题。但是如果你把DataItem属性的类型也想象成DataRowView,就很容易走偏了。我写一个简单的demo:
<%@ Page Language="C#" %>

<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        var datas = new Person[] { new Person { 姓名 = "张三", 住址 = "河边茅草屋" } };
        this.View1.DataSource = datas;
        this.View1.DataBind();
    }

    class Person
    {
        public string 姓名 { get; set; }
        public string 住址 { get; set; }
    }

    protected string Lookup(object container)
    {
        return container.GetType().FullName;
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    <asp:FormView ID="View1" runat="server" Height="50px" Width="125px">
        <ItemTemplate>
            <asp:Button ID="Button1" runat="server" Text='<%#Eval("姓名") %>' />
            <asp:Button ID="Button2" runat="server" Text='<%#Lookup(Container) %>' />
        </ItemTemplate>
    </asp:FormView>
    <asp:ListView ID="ListView1" runat="server">
    </asp:ListView>
    </form>
</body>
</html>
显然这时候Container.DataItem的类型是自定义的“Person”,是直截了当的数据模型类型,而不是任何你所知道的其它类型。

再反观这个demo,我们设计界面时并不纠缠于数据源一定是什么类型,不论是Person[]、List<Person>、DataTable还是别的什么(例如通过SqlDataSource或者ObjectDatasource等)来提供数据源中的数据,任它千变万化(我们至少可以在csdn上看到10种以上),界面设计师所写的绑定表达式“#Eval("姓名")”总是正确而清晰地表达了交互界面设计思想,无需纠缠于针对将来负责提供数据的小程序员所重构的某种数据源形式而修改设计代码,因此这正是工程所需要的东西。

至于说“性能不是最好的”,其实如果要知道有多差就去写测试代码来验证到底差到多少了。否则这往往对真正的设计师没有什么意义。如果为了效率“最好”,我们就根本不用使用高级编程语言而应该去使用汇编或者机器码编程,并且我们不应该使用.net而应该去使用尽可能低级和简单的操作系统,然后每个人都自己从头开发出一套各不相同的操作系统和应用系统来。 --------------------编程问答--------------------
引用 10 楼 sp1234 的回复:
引用楼主 tqbba 的回复:
一般用在哪啊

<%#((DataRowView)Container.DataItem)["字段名"]%>或
<%#((DataRowView)Container.DataItem).Rows[0]["字段名"]%>
用这两句.数据源必须是DataSet,DataTable吧?


从asp.net2.0开始,绑定表达是使用Eval,基本不需要使用C……

很给俩 
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,