[ASP.NET][ADO.NET](note)資料繫結運算式(DataBinding Expression)專論

摘要:[ASP.NET](note)資料繫結運算式(DataBinding Expression)專論

為了徹底搞懂ASP.NET的資料綁定,我花了一天時間找網路找了2本的範例來對照,
我總算搞懂了,累死我,假日還坐在電腦中研究程式,雖累但是很值得,
我又往前邁一步啦,我整理出來如下:

◆資料繫結運算式(可以繫結簡單屬性、集合、表達式、方法)
  ( http://support.microsoft.com/kb/307860/zh-tw )

=============================================================================
***資料繫結運算式 DataBinding Expression***
重要:Eval()、 Bind()與XPath()  等資料繫結運算方法,只能在『資料繫結控制項』的內容中使用,
      因為它們是「<%#資料繫結運算式%>」,
       也就是說從資料庫撈出來的資料,可以用Eval()、 Bind()直接繫結在具「DataSourceID」
     的資料控制項上;( 須搭配Page.DataBind() 或 控制項ID.DataBind() )
 
       但從資料庫撈出來的資料若要繫結在『非資料繫結控制項』,須先在CS後端中先宣告「公用變數」,
     再把撈出來的資料塞給公用變數,接下來就可以在「前台」直接繫結此「公用變數」
       (即<%# 後台public變數 %>→寫在asp.net控制項標籤頭< >之內 
        或 <%# 後台public變數 %>→寫在asp.net控制項標籤頭< > 與 標籤尾</ >之間
        或  <%= 後台public變數 %>→寫在純html標籤頭< > 與 標籤尾</ >之間)。
 
不具「DataSourceID」的資料控制項,其在後端自定一個連DB撈資料的方法(例:getdata()),
再搭配Page.DataBind() 或 控制項ID.DataBind(),並在PageLoad或其它事件中觸發自定的getdata()。 
 
(具「DataSourceID」的控制項可以在前端讓它繫結一個後端撈資料如自命名為getdata()的方法
並在此方法結尾return出來後,
再取出想要的欄位即可)
 
--.NET 1.X版的寫法
<%#Containner.DataItem("資料表欄位名稱")%>, 在vs2010後中的formview使用可能會發生錯誤
<%#DataBinder.Eval(Container.DataItem,"資料表欄位名稱")%>
 
--.NET 2.0後的寫法
<%# Eval("欄位名稱、或變數名稱") %>單向繫結,唯讀不可修改,通常用在Lable、Dropdownlist
<%# Bind("欄位名稱、或變數名稱") %>雙向繫結,可讀亦可修改,通常用在TextBox
以下程式碼範例:
------------------------------------------------------------------------------------
public string mylabel1; //不具「DataSourceID」的資料控制項的資料繫結方式
    protected void dbdata()
    { 
    string ds2 =WebConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString;
    SqlConnection connn = new SqlConnection(ds2);
    SqlDataReader drr = null;
    string dc2 = "select   * from test";
    SqlCommand cmdd = new SqlCommand(dc2,connn);
    connn.Open();
    drr = cmdd.ExecuteReader();
    while(drr.Read())
    {
    mylabel1 +=drr["title"].ToString();
    }
      Page.DataBind();
    }
<!--在前台的三種繫結方式,三選一即可 -->
 <asp:Label ID="Label1" runat="server" Text='<%# mylabel1 %>' >  </asp:Label>
  或
 <p>  <% =mylabel1 %>   </p>
  或
 <asp:Label ID="Label2" runat="server"><% =mylabel1 %> <br/></asp:Label>
 
PS:(要斷行請自行加上<br/>)
 
=============================================
//「DataSourceID」的資料控制項的資料繫結方式
 public SqlDataReader DLfrom1() //這裡是用「public SqlDataReader」
    {
        //宣告連線字串
        string ds = WebConfigurationManager.ConnectionStrings["MailToConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(ds);
        SqlDataReader dr = null;
        string dc = "select * from FromSetting ";
        SqlCommand cmd = new SqlCommand(dc, conn);
        //dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                                      //加上CommandBehavior.CloseConnection自動關閉連線,就能安心return
        dr = cmd.ExecuteReader( );
        dr.Read();
        return dr;
    }
前台:
 <asp:DropDownList ID="DropDownList1" runat="server" DataSource="<%# DLfrom1( )%>"
    DataTextField="useFrom" DataValueField="usePort" >
    </asp:DropDownList>
    ps:注意看,它有DataSourceID屬性。
***
如果是大型控制項,如FormView、Repeater,
直接在「樣板」<%# Eval("欄位名稱")%><%# Bind("欄位名稱")%>就好啦~~
 
<asp:FormView ID="FormView1" runat="server" CellPadding="4" DataKeyNames="id" ForeColor="#333333">
            <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            <RowStyle BackColor="#E3EAEB" />
            <PagerStyle BackColor="#666666" ForeColor="White" HorizontalAlign="Center" />
            <HeaderStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
            
            <ItemTemplate>
                            id:   <asp:Label ID="idLabel" runat="server" Text='<%# Eval("id") %>'></asp:Label><br />
                            title:  <asp:Label ID="titleLabel" runat="server" Text='<%#
DataBinder.Eval(Container.DataItem,"title")
%>' Font-Bold="True" ForeColor="#FF0000"></asp:Label><br />
                            summary:  <asp:Label ID="summaryLabel" runat="server" Text='<%# Eval("summary") %>' Font-Italic="True" ForeColor="Gray" Font-Size="10pt"></asp:Label><br />
                            article:   <br />
                            <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("article") %>' Font-Size="Small" Height="300px" TextMode="MultiLine" Width="600px"></asp:TextBox><br /><br />                
            </ItemTemplate>
 
</asp:FormView>
後端仍須用ADO.NET把資料撈出喔,前端的大型控制項才能做資料繫結。
.........
.........
            Conn.Open();   
            dr = cmd.ExecuteReader();   
            FormView1.DataSource = dr;
            FormView1.DataBind();
..................
...........................
 

補充一些:

1.

1.1在(CS)直接宣告,不是從資料庫撈出:
   在(CS): public string re{ get { return "文字";} }
   前端html直接 : <%=re%> ,不必加html標籤,就能秀在網頁上了。
1.2在(CS)直接宣告,不是從資料庫撈出:
   寫在控制項頭尾標籤之『間』(有等號), 如下:
   <asp:Label ID="Label1" runat="server">  <%= re %>  </asp:Label>
1.3在(CS)直接宣告,不是從資料庫撈出:
   在(CS):public DataTime LoginTime = DataTime.Now;
   <asp:Label ID="Label1" runat="server" Text="<%# LoginTime%>">       </asp:Label>
 
 
2.從資料庫撈出來的資料, 要繫結在控制項的標籤之『內』:
<%#資料繫結運算式%>//只能在"資料繫結控制項"的內容中使用。
使用方式一:<%# Eval("欄位名稱")%>
使用方式二:<%# DataBinder.Eval(Container.DataItem, "欄位名稱")%>
 
註:繫結時間時兼將時間格式化 
Text='<%# Eval("LoginTime", "{0:yyyy-MM-dd HH:mms}") %>'
 
ps:使用 <%= ... %> 語法就等於使用 Response.Write 一樣,且程式碼會再 PreRender 之後才會執行。 
//http://support.microsoft.com/kb/307860/zh-tw
 

已累......

 
--
強烈建議購物網店或實體店家都必須使用關鍵字廣告or原生廣告來將Yahoo上與聯播網的廣大流量導至自己的網站!

●Yahoo關鍵字廣告/原生廣告
◆Yahoo廣告方案介紹 : https://goo.gl/5k8FHW
◆Yahoo廣告剖析與運用 : http://goo.gl/4xjUJD

 

​​