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>
任何帮助不胜感激。
谢谢。
这似乎已经完成了帽子戏法。任何原因手动数据绑定呼叫是必需的?如果您有EnableViewState =“false”,我认为这会导致对数据源的多次调用。如果数据源是SQL数据源(就像我的实际代码中那样),这会导致多个数据库调用相同的信息。这是不正确的? – saarp 2011-05-06 15:43:01
是的,你是对的,但如果你设置EnableViewState = false,那么它将不会保留Http请求中的值。如果EnableViewState为false,则可以使用控件状态来持久存储特定于控件的属性信息,并且无法关闭像视图状态属性。 – 2011-05-06 16:19:43