如何在Postbacks中维护DataList项目索引?

时间:2015-12-15 12:44:31

标签: asp.net webforms

我正在尝试在页面重新加载时保留Datalist项目的索引。我试图通过将索引存储到Session中然后将DataList对象的索引设置为Session来实现。这是HTML代码:

<asp:DataList ID="MyList" Width="100%" RepeatDirection="Vertical" runat="server"
                            OnItemDataBound="MyList_ItemDataBound" OnItemCommand="MyList_ItemCommand">
                            <ItemTemplate>
                                <table class="table">
                                    <tr>
                                        <td style="width: 5%;">
                                            <asp:Label ID="lbl_id" runat="server" Text='<%# Eval("id") %>' Visible="false" />
                                            <asp:Label ID="lbl_isread" runat="server" Text='<%# Eval("isread") %>' Visible="false" />
                                            <input type="checkbox" id="chk_vd" runat="server" class="chkitem" />
                                        </td>
                                        <td style="width: 15%;">
                                            <asp:HyperLink ID="usr" runat="server" Text='<%# Eval("from") %>' />
                                        </td>
                                        <td style="width: 62%;">
                                            <asp:LinkButton ID="sub" Text='<%# Eval("subject") %>' CommandName="select" runat="server"></asp:LinkButton>
                                        </td>
                                        <td style="width: 18%;">
                                            <asp:Label ID="dt" runat="server" Text='<%# Eval("Date_Added") %>' />
                                        </td>
                                    </tr>
                                </table>
                            </ItemTemplate>
                            <SelectedItemTemplate>
                                <table class="table">
                                    <tr>
                                        <td style="width: 5%;">
                                            <asp:Label ID="lbl_id" runat="server" Text='<%# Eval("id") %>' Visible="false" />
                                            <asp:Label ID="lbl_isread" runat="server" Text='<%# Eval("isread") %>' Visible="false" />
                                            <asp:Label ID="lbl_messagetype" runat="server" Text='<%# Eval("messagetype") %>'
                                                Visible="false" />
                                            <asp:Label ID="lbl_groupid" runat="server" Text='<%# Eval("groupid") %>' Visible="false" />
                                            <asp:Label ID="lbl_content_id" runat="server" Text='<%# Eval("content_id") %>' Visible="false" />
                                            <asp:Label ID="lbl_sendertype" runat="server" Text='<%# Eval("sendertype") %>' Visible="false" />
                                            <input type="checkbox" id="chk_vd" runat="server" class="chkitem" />
                                        </td>
                                        <td style="padding: 5px; text-align: left; vertical-align: top; width: 15%;">
                                            <uc1:avator ID="avt" runat="server" UserName='<%# Eval("from") %>' PhotoName="" Width="65"
                                                Height="65" />
                                            <br />
                                            <asp:HyperLink ID="usr" runat="server" Text='<%# Eval("from") %>' />
                                        </td>
                                        <td style="padding: 5px; text-align: left; vertical-align: top; width: 62%;">
                                            <div class="item_pad_4">
                                                <h3 id="s_sub" runat="server">
                                                    <%# Eval("subject") %>
                                                </h3>
                                            </div>
                                            <asp:Label ID="msg" runat="server" Text='<%# Eval("body") %>'></asp:Label>
                                            <div class="bx_br_tp item_pad_4">
                                                <div class="btn-group" id="<%# Eval("id") %>">
                                                    <asp:LinkButton ID="a" CssClass="btn btn-primary btn-xs" runat="server" />
                                                    <asp:LinkButton ID="r" CssClass="btn btn-primary btn-xs" runat="server" />
                                                    <%--                                                        <asp:LinkButton ID="lnk_spam" CssClass="btn btn-primary btn-xs" runat="server"
                                                        Text="spam" CommandName="spam"></asp:LinkButton>--%>
                                                </div>
                                            </div>
                                        </td>
                                        <td style="padding: 5px; text-align: left; vertical-align: top; width: 18%;">
                                            <asp:Label ID="dt" runat="server" Text='<%# Eval("Date_Added") %>' />
                                        </td>
                                    </tr>
                                </table>
                            </SelectedItemTemplate>
                        </asp:DataList>

在服务器端,我正在尝试恢复DataList项的索引,如下所示:

        if (!Page.IsPostBack)
    {

        if (Session["datalist"] != null)
        {
            ((DataList)Session["datalist"]).SelectedIndex = (int)Session["index"];
        }

这是执行数据绑定的功能:

   protected void MyList_ItemCommand(object source, DataListCommandEventArgs e)
{
    Session["datalist"] = source;
    string cmd = ((LinkButton)e.CommandSource).CommandName;
    long messageid = long.Parse(((Label)e.Item.FindControl("lbl_id")).Text);
    string username = ((HyperLink)e.Item.FindControl("usr")).Text;

    // approve / ignore action related values
    long content_id = 0;
    long groupid = 0;
    int messagetype = 0;

    int index = e.Item.ItemIndex;
    Session["index"] = index;
    index = (int)Session["index"];
    switch (cmd)
    {
        case "select":
            ((DataList)source).SelectedIndex = e.Item.ItemIndex;
            int isread = int.Parse(((Label)e.Item.FindControl("lbl_isread")).Text);
            // mark message as read it its unread message
            if (isread == 0)
            {
                isread = 1; // message is read
                MailBoxBLL.Update_isRead(messageid, isread, Page.User.Identity.Name);
            }
            string _cache = "usr_msg_cnt_" + UserName;
            if (HttpContext.Current.Cache[_cache] != null)
            {
                Cache.Remove(_cache);
            }
            break;

这不起作用,并且在页面重新加载时不会选择Datalist项目。我怎样才能使它工作? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

直接在页面加载中添加: -

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["datalist"] != null)
         ((DataList)Session["datalist"]).SelectedIndex = (int)Session["index"];
}

您的代码的问题是初始获取请求中的Page.IsPostBack属性为false,并且对于每个页面重新加载(实际回发),它都是真的。因此,!Page.IsPostBack实际上将变为 false ,您的代码将永远不会执行。