奇怪的DataList选择/取消选择行为

时间:2011-05-06 07:49:21

标签: c# asp.net select datalist unselect

我很难理解DataList select / unselect应该如何工作。我的印象是,当您设置SelectedIndex时,DL将更改将项目显示切换到相应的模板。

我看到的行为是:  1.选择项目 - 样式更改,但模板不会  2.再次选择相同或不同的项目 - 第一个选定项目的模板更改。  3.再次选择另一个项目 - 在#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>

非常感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分: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();
    }