2011-05-06 65 views
1

我很難理解DataList選擇/取消選擇應該如何工作。我的印象是,當您設置SelectedIndex時,DL會更改切換項目顯示到適當的模板。奇怪的DataList選擇/取消選擇行爲

我看到的行爲是: 1.選擇項目樣式更改,但模板不是 2.再次選擇相同或不同的項目 - 第一個選定項目的模板更改。 3.再次選擇另一個項目 - 在#2模板選擇項目變化 4等。

我已經創建了下面的代碼,忠實再現的行爲對我來說:

<%@ Page Language="C#" Trace="true" %> 

<%@ Import Namespace="System.Data" %> 

<script runat="server"> 

    // Method to handle DataList ItemCommand 
    protected void dl_ItemCommand(object sender, DataListCommandEventArgs e) 
    { 
     DataList dl = sender as DataList; 
     if (e == null || e.Item == null) 
     { 
      Trace.Write("dl_ItemCommand", "EventArgs.Item is null"); 
      throw new Exception("dl_ItemCommand: EventArgs.Item is null"); 
     } 

     int selIdx = dl.SelectedIndex; 

     Trace.Write("dl_ItemCommand", String.Format("{0}: {1}", 
      e.CommandName.ToLower(), e.Item.ItemIndex)); 
     switch (e.CommandName.ToLower()) 
     { 
      case "select": 
       selIdx = e.Item.ItemIndex; 
       break; 
      case "unselect": 
       selIdx = -1; 
       break; 
     } 

     if (selIdx != dl.SelectedIndex) 
      dl.SelectedIndex = selIdx; 
    } 


</script> 

<html> 
<head> 
    <title>Test</title> 
</head> 
<body style="padding: 20px;"> 
<form runat="server" id="form1"> 

    <asp:DataList ID="dl" runat="server" 
     CellPadding="1" CellSpacing="1" BorderWidth="0px" Width="100%" 
     DataSourceID="ds" OnItemCommand="dl_ItemCommand"> 
     <SeparatorTemplate> 
      <hr /> 
     </SeparatorTemplate> 
     <ItemTemplate> 
      <asp:Button ID="Button1" CommandName="select" runat="server" /> 
      Summary: <%# XPath("ID") %> 
      <br /> 
     </ItemTemplate> 
     <ItemStyle CssClass="ListItem" /> 
     <SelectedItemTemplate> 
      <asp:Button ID="Button2" CommandName="unselect" runat="server" /> 
      <b>Detail: <%# XPath("ID")%></b> 
      <br /> 
     </SelectedItemTemplate> 
     <SelectedItemStyle BackColor="#f8f8f8" BorderColor="#888888" BorderStyle="Solid" 
      BorderWidth="1px" /> 
    </asp:DataList> 

    <asp:XmlDataSource ID="ds" runat="server" XPath="/List/Item"> 
     <Data> 
      <List> 
       <Item><ID>1889</ID></Item> 
       <Item><ID>1890</ID></Item> 
       <Item><ID>790</ID></Item> 
       <Item><ID>4584</ID></Item> 
       <Item><ID>4368</ID></Item> 
       <Item><ID>4546</ID></Item> 
      </List> 
     </Data> 
    </asp:XmlDataSource> 
</form> 
</body> 
</html> 

任何幫助不勝感激。

謝謝。

回答

1

問題是dl_ItemCommand。你錯過dl.DataBind()

試試這個

protected void dl_ItemCommand(object sender, DataListCommandEventArgs e) 
    { 
     DataList dl = sender as DataList; 
     if (e == null || e.Item == null) 
     { 
      Trace.Write("dl_ItemCommand", "EventArgs.Item is null"); 
      throw new Exception("dl_ItemCommand: EventArgs.Item is null"); 
     } 

     int selIdx = dl.SelectedIndex; 

     Trace.Write("dl_ItemCommand", String.Format("{0}: {1}", 
      e.CommandName.ToLower(), e.Item.ItemIndex)); 
     switch (e.CommandName.ToLower()) 
     { 
      case "select": 
       selIdx = e.Item.ItemIndex; 
       break; 
      case "unselect": 
       selIdx = -1; 
       break; 
     } 

     if (selIdx != dl.SelectedIndex) 
      dl.SelectedIndex = selIdx; 
     dl.DataBind(); 
    } 
+0

這似乎已經完成了帽子戲法。任何原因手動數據綁定呼叫是必需的?如果您有EnableViewState =「false」,我認爲這會導致對數據源的多次調用。如果數據源是SQL數據源(就像我的實際代碼中那樣),這會導致多個數據庫調用相同的信息。這是不正確的? – saarp 2011-05-06 15:43:01

+0

是的,你是對的,但如果你設置EnableViewState = false,那麼它將不會保留Http請求中的值。如果EnableViewState爲false,則可以使用控件狀態來持久存儲特定於控件的屬性信息,並且無法關閉像視圖狀態屬性。 – 2011-05-06 16:19:43