2011-05-06 6 views
1

DataList select/unselect가 작동하는 방법을 이해하는 데 어려움을 겪고 있습니다. 나는 인상에 따라 SelectedIndex를 설정할 때 DL이 아이템 디스플레이를 적절한 템플릿으로 바꿀 것입니다.Strange DataList 선택/선택 취소 동작

표시되는 동작은 다음과 같습니다. 1. 항목 스타일 변경을 선택하지만 템플릿은 이 아닙니다. 2. 처음 선택한 항목의 템플릿이 다시 변경됩니다.

<%@ 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> 

어떤 도움이 것 : - 3. 다른 다시 항목을 선택 # 2 템플릿에서 선택한 항목이 나는 충실하게 나를 위해 동작을 재현 다음 코드를 만들었습니다

4 등 .. 변경 대단히 감사하겠습니다.

감사합니다.

답변

1

문제는 우선은 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

을 시도 놓친 dl_ItemCommand입니다. 수동 databind 호출이 필요한 이유는 무엇입니까? EnableViewState = "false"로 설정하면 데이터 소스에 대한 호출이 여러 번 발생합니다. 데이터 소스가 SQL 데이터 소스 인 경우 (실제 코드의 경우처럼) 동일한 정보에 대해 여러 DB 호출이 발생합니다. 이것은 틀린가? – saarp

+0

맞습니다.하지만 EnableViewState = false로 설정하면 Http 요청에서 값이 보존되지 않습니다. EnableViewState가 false이면 컨트롤 상태를 사용하여 컨트롤에 고유 한 속성 정보를 유지할 수 있으며 해제 할 수 없습니다 뷰 상태 속성과 같습니다. –