如何将 DataList.SelectedItem 设置为等于 uniqeItemId



我有一个名为dashboard的对象列表,其中包含公告列表及其公告ID。我的 DataListNotices.DataSource 等于仪表板,但我无法弄清楚如何使所选项目等于我在客户端选择的项目。

当前正在发生的事情是,当我选择未读公告时,它会使用一些 css 显示消息,但目前它会对错误的公告执行此操作。

protected void DataListAnnouncements_ItemCommand(object source, DataListCommandEventArgs e)
{
if (e.CommandName == "Select")
    {
        IList<DashBoardView> dashboard = new List<DashBoardView>();
        dashboard = (IList<DataObjects.DashBoardView>)ListOfObjects;
        UnreadAnnouncement unread = UnreadAnnouncements;
        if (e.CommandArgument != null)
        {
            if (unread != null)
            {
                unread.WasRead = true;
                UpdateUnreadAnnouncement(unread);
                att = unread.AnnouncementId;
            }
        }

        dashboard[e.Item.ItemIndex].WasRead = unread.WasRead;

        DataListAnnouncements.DataSource = Session["dashboard"];
        DataListAnnouncements.SelectedItem = dashboard[e.Item.ItemIndex]
        (DataListAnnouncements.SelectedItem = att <---- Something Like this is what I would like to implement?)
        Session["dashboard"] = dashboard;
        bindDataList();
        }
        }

正如你现在看到的,我使用仪表板[e.Item.ItemIndex]拥有它。已读 = 未读。WasRead 行,但这被证明不起作用,因为索引并不总是我想要的。所以我想使用一个属性。我环顾四周,但我仍然不清楚如何在 C# 和 asp 端实现它。这是我的ASP。

<ItemTemplate>
                <table width="880px">
                    <tr>
                        <td class="leftCol">
                            <asp:LinkButton Text='<%# Eval("title") %>' CssClass="bold" runat="server" CommandName="Select" CommandArgument='<%# Eval("UnreadAnnouncementId") %>' ID="titleLabel" /></span>
                        </td>
                        <td class="created">
                            <asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "Effective", "{0:MM/dd/yyyy}") %>' CssClass="created" runat="server" ID="Label4" />
                            <br />
                            <asp:Label Text='<%# Eval("FirstName") %>' runat="server" ID="Label2" />
                            <asp:Label Text='<%# Eval("LastName") %>' runat="server" ID="Label3" />
                        </td>
                    </tr>
                    <tr>
                        <td class="one-long-line">
                            <asp:Label Text='<%# Eval("details") %>' CssClass="details" runat="server" ID="detailsLabel" />
                        </td>
                    </tr>
                </table>
            </ItemTemplate>
            <SelectedItemTemplate>
                <table width="880px" cellpadding="10px">
                    <tr>
                        <td class="leftCol">
                            <asp:Label Text='<%# Eval("title") %>' CssClass="bold" runat="server" ID="titleLabel" />
                            <asp:Label runat="server" ID="wasRead" Text='<%# Eval("wasRead") %>' Visible="false" Enabled="false" />
                            <td class="created">
                                <asp:Label Text='<%# DataBinder.Eval(Container.DataItem, "Effective", "{0:MM/dd/yyyy}") %>' CssClass="created" runat="server" ID="Label4" />
                                <br />
                                <asp:Label Text='<%# Eval("FirstName") %>' runat="server" ID="Label2" />
                                <asp:Label Text='<%# Eval("LastName") %>' runat="server" ID="Label3" />
                            </td>
                    </tr>
                    <tr>
                        <td class="deailsTD" colspan="2">
                            <asp:Label Text='<%# Eval("details") %>' CssClass="details" runat="server" ID="detailsLabel" />
                        </td>
                    </tr>
                    <tr>
                    </tr>
                </table>
            </SelectedItemTemplate>

我希望能够单击数据网格中的某个项目,它将展开该项目并向我显示详细信息。

您必须使用"SelectedIndex",而不是 SelectedItem"。来源:如何:允许用户选择 DataList Web 服务器控件中的项。 可能是这样的:

DataListAnnouncements.SelectedIndex = e.Item.ItemIndex;

从您的代码中不清楚dashboardatt之间的关系。如果有任何方法可以在仪表板中找到att并找到它的位置,您可以这样做:

DataListAnnouncements.SelectedIndex = attposition;

编辑:有一种简单的方法可以控制DataList项目的背景颜色。我们可以解析DataList 的 ItemBound 中的每个项目,并像下面这样设置 BackColor:

protected void DataListAnnouncements_ItemDataBound(object sender, DataListItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item ||
        e.Item.ItemType == ListItemType.AlternatingItem||
         e.Item.ItemType == ListItemType.SelectedItem
        )
    {
        // Here BackColor - Grey: WasRead; Yellow: Unread
        var wasRead = ((DashBoardView)e.Item.DataItem).WasRead;
        e.Item.BackColor = wasRead? System.Drawing.Color.Gray: System.Drawing.Color.Yellow;
    }
}

您甚至可以通过将if条件拆分为两个来进一步扩展它:

if (e.Item.ItemType == ListItemType.Item ||e.Item.ItemType == ListItemType.AlternatingItem){}

if ( e.Item.ItemType == ListItemType.SelectedItem){}

最新更新