简体   繁体   中英

How to set a DataList.SelectedItem equal to a uniqeItemId

I have a list of objects called dashboard which holds a list of Announcements with their AnnouncementId. My DataListAnnouncements.DataSource is equal to the dashboard but I can't figure out how to get the selectedItem equal to the item that I am selecting in the client side.

What Currently is happening is when I select an unread announcement, it displays the message with some css, but it does that to the wrong announcement at the moment.

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();
        }
        }

as you see now, I have it using the dashboard[e.Item.ItemIndex].WasRead = unread.WasRead line, but this proves to not work since the index is not always what I want. So I want to use an attribute. I looked around a bit but I am still fuzzy on how to implement it on the C# and asp side. and this is my 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>

I want to be able to click on a item in the datagrid, and it will expand that item and show me the details.

You have to use `SelectedIndex', not SelectedItem'. Source: How to: Allow Users to Select Items in DataList Web Server Controls . It could be like this:

DataListAnnouncements.SelectedIndex = e.Item.ItemIndex;

From your code it is not clear what is the relation between dashboard and att . If there's any way to find the att in dashboard and find it's position, you can do like this:

DataListAnnouncements.SelectedIndex = attposition;

EDIT : There's an easy way to control background color of DataList s Items. We can parse each item in DataList 's ItemBound and set BackColor like below:

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;

    }

}

You can even expand it more by splitting the if condition into two:

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

and

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM