關於DataGrid Web控制項的熱門問題

來源:互聯網
上載者:User
datagrid|web|控制項|問題   
編輯模式下顯示一個Drop-Down List 
這裡將提供給使用者的一個常用需求——一個某行處於編輯狀態下的Drop-Down List。舉例來說,一個DataGrid可能顯示一個書籍清單,其中包括每本書的類別,當使用者編輯一條書籍記錄時,可能要為該書指定一個不同的類別,理想情況下,他們可以從Drop-Down List中選擇可能的類別值,比如“小說”、“生物”或者“參考書目”。 
顯示一個Drop-Down List需要在DataGrid中設定一個模板列。典型的情況是:項目範本包含了一個控制項,比如一個資料繫結的Label控制項來顯示記錄中某個欄位的當前值。然後,向編輯項目範本中添加一個Drop-Down List,在VS中,你可以通過DataGrid的屬性產生器添加一個模板列,然後通過“編輯模板”移除編輯項目範本中預設的TextBox控制項,並拖入一個Drop-Down List控制項,你還可以在HTML視圖下添加模板列。 
在建立了含有Drop-Down List的模板列後還有兩個任務:首先,要產生一個列表,其次要設定列表中的預選項。舉例來說,如果本書的類別設為“小說”,當Drop-Down List顯示時,往往需要“小說”是預選的(預選一個項並不是在所有情況下都要討論的問題)。 
可以有多種產生Drop-Down List的方法。下面的幾個例子說明了三種方式:使用靜態項;使用DataSet中的記錄集合;使用DataReader直接從資料庫中讀取資訊。 
l         靜態項:在Drop-Down List中顯示靜態項不需要綁定資料到控制項。你可以很簡單地在控制項的項集合中定義項。在VS中,可以通過屬性視窗中的Items屬性觸發項集合編輯器,也可以在HTML視圖中編輯項。
下面是一個顯示模式下顯示類別的模板列和編輯模式下類別的靜態列表的完整定義。項目範本包含了一個Label控制項,其Text屬性被設定為目前記錄的“genre”(類別)欄位,編輯項目範本中的靜態項定義高亮顯示。
<asp:TemplateColumn HeaderText="genre"> 
    <ItemTemplate> 
      <asp:Label id=Label4 runat="server" 
         Text=’<%# DataBinder.Eval(Container, "DataItem.genre") %>’> 
      </asp:Label> 
    </ItemTemplate> 
    <EditItemTemplate> 
      <asp:DropDownList id="DropDownList2" runat="server" Width="172px"> 
         <asp:ListItem Value="fiction">fiction</asp:ListItem> 
         <asp:ListItem Value="biography">biography</asp:ListItem> 
         <asp:ListItem Value="reference">reference</asp:ListItem> 
      </asp:DropDownList> 
    </EditItemTemplate> 
</asp:TemplateColumn> 
l         DataSet
如果你想要在Drop-Down List中顯示的資料處於一個DataSet裡,那麼你可以採用通用的資料繫結方式。下面是它的聲明文法。Drop-Down List綁定了資料集DsBooks1中的類別表。資料繫結的設定高亮顯示。
<asp:TemplateColumn HeaderText="genre (dataset)"> 
    <ItemTemplate> 
      <asp:Label id=Label3 runat="server" 
          Text=’<%# DataBinder.Eval(Container, "DataItem.genre") %>’> 
      </asp:Label> 
    </ItemTemplate> 
    <EditItemTemplate> 
      <asp:DropDownList id=DropDownList4 runat="server" 
         DataSource="<%# DsBooks1 %>" DataMember="Genre" 
         DataTextField="genre" DataValueField="genre" Width="160px"> 
       </asp:DropDownList> 
    </EditItemTemplate> 
</asp:TemplateColumn> 
l         DataReader
你也可以直接從資料庫產生Drop-Down List。這種方式更為複雜但效率也更高。原因在於只有在需要的時候才去讀資料庫。
實現的一個相當簡便的方法是利用WEB表單資料繫結運算式。儘管最常用的是在資料繫結運算式中調用DataBinder.Eval 方法,但事實上你可以使用該頁任何可用的public成員。下面的例子告訴你如何建立一個函數來建立、填充以及返回一個DataTable對象,Drop-Down List可以對它進行綁定。
這種情況下,你需要能夠執行一個能得到你需要的記錄集的資料命令。比如說,你可能需要定義一個Command,並把它的CommandText屬性設為“SELECT * FROM Genres”。為了簡化例子,假設在頁面中已經有了一個Connection對象和一個Command對象。
由建立頁面中的一個共有函數開始。這個函數建立了一個DataTable對象並定義了你需要的列集合。然後開啟串連,執行Command命令來返回一個DataReader,並且遍曆DataReader,複製資料到DataTable,最後,將DataTable作為該函數的傳回值返回。
下面說明了如何?。該例中返回的DataTable中只有一列(“genre”)。通常只需要一個列來產生Drop-Down List。如果需要將其Text和Value設成不同的值,就需要兩個列。
public DataTable GetGenreTable() 

    DataTable dtGenre = new DataTable(); 
    if(Application["GenreTable"] == null) 
    { 
      DataRow dr; 
      DataColumn dc = new DataColumn("genre"); 
               dtGenre.Columns.Add(dc); 
      this.sqlConnection1.Open(); 
      System.Data.SqlClient.SqlDataReader dreader = 
          this.sqlCommand1.ExecuteReader(); 
      while(dreader.Read()) 
      { 
          dr = dtGenre.NewRow(); 
         dr[0] = dreader[0]; 
         dtGenre.Rows.Add(dr); 
      } 
      this.sqlConnection1.Close(); 
     } 
   else 
   { 
      dtGenre = (DataTable) Application["GenreTable"]; 
   } 
   return dtGenre; 

   注意:該函數將它建立的DataTable儲存於Application態,由於這裡的DataTable就象一個靜態查詢表,所以並不需要在每次一個不同行轉為編輯模式時都重新讀取它,而且,由於同一個DataTable可以被多使用者使用,可以將其儲存在全域的Application態而不是儲存在根據使用者不同而不同的Session態。 
       下面是模板列的聲明,你會發現這與綁定DataSet中表的文法非常相似,唯一的真正區別就是資料來源的綁定調用的是你自己的函數。這種技術的稍有不利之處在於,在VS中,得不到太多的設計類型服務。由於是通過代碼定義DataTable來綁定,VS不會提供任何方式來對DataMember、DataTextField和DataValueField屬性進行設定,需要你自己來確定這些屬性,使它們與你在代碼中建立的成員名字相匹配。 
<asp:TemplateColumn HeaderText="genre (database)"> 
   <ItemTemplate> 
      <asp:Label id=Label1 runat="server" 
          Text=’<%# DataBinder.Eval(Container, "DataItem.genre") %>’> 
      </asp:Label> 
   </ItemTemplate> 
   <EditItemTemplate> 
      <asp:DropDownList id=DropDownList1 runat="server" 
         DataSource="<%# GetGenreTable() %>" 
         DataMember="Genre" 
         DataTextField="genre" 
         DataValueField="genre" 
         Width="120px"> 
     </asp:DropDownList> 
   </EditItemTemplate> 
</asp:TemplateColumn> 
(Unfinished)

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。