【问题标题】:Strange DataList select/unselect behavior奇怪的 DataList 选择/取消选择行为
【发布时间】:2011-08-19 23:35:27
【问题描述】:

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

我看到的行为是: 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>

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: c# asp.net select datalist unselect


    【解决方案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();
        }
    

    【讨论】:

    • 这似乎成功了。需要手动数据绑定调用的任何原因?如果您有 EnableViewState="false" 我认为这会导致对数据源的多次调用。如果数据源是 SQL 数据源(在我的实际代码中就是这种情况),这将导致多个数据库调用相同的信息。这是不正确的吗?
    • 是的,你是对的,但是如果你设置 EnableViewState=false 那么它不会在 Http 请求中保留值。如果 EnableViewState 为 false,你可以使用控件状态来保存特定于一个控件,不能像视图状态属性一样被关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2014-05-28
    • 1970-01-01
    • 2013-04-27
    • 2015-07-13
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多