Solved

Read Anonymous Type from DataItem?

Posted on 2009-04-09
3
1,342 Views
Last Modified: 2013-11-11
I'm attempting to load a page with a datalist nested into a repeater. What I want to do is create the datasource for the datalist on the itemdatabound event of the repeater. It's working however I need to filter my datasource down based on a value in my repeater's itemtemplate (SubCategory). I would like to read the value from the e.Item.DataItem. SubCategory into a string but for whatever reason, I can't seem to get it, although I can see it in the watch window.

// aspx
<asp:Repeater ID="rptItems" runat="server" OnItemDataBound="rptItems_ItemDataBound">
                    <ItemTemplate>
                        <h2><%# Eval("SubCategory") %> /></h2>
                        <asp:DataList ID="dlSubList" runat="server"
                            RepeatDirection="Vertical" RepeatColumns="4">
                            <HeaderTemplate>
                                <ul>
                            </HeaderTemplate>
                            <ItemTemplate>
                                <li><%# Eval("ListItem")%></li>
                            </ItemTemplate>
                            <FooterTemplate>
                                </ul>
                            </FooterTemplate>
                        </asp:DataList>
                    </ItemTemplate>
                </asp:Repeater>
 
private List<ItemData> m_Items; // populated from db
 
// code for repeater data
rptList.DataSource = (from i in m_Items select new {i.SubCategory}).Distinct();
rptList.DataBind();
                                
protected void rptItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
        string sSubCategory = e.Item.DataItem ???? How do I get the SubCategory value from the anonymous type? 
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataList dl = (DataList)e.Item.FindControl("dlSubList");
            var oList = (from p in m_Items as List<PDFIndexRecord>
                         where p.SubCategory.Equals(sSubCategory)
                         select p).ToList();
            dl.DataSource = oList;
            dl.DataBind();
        }
}

Open in new window

0
Comment
Question by:Turgeson
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 23

Expert Comment

by:Jens Fiederer
ID: 24118846
Have you tried just ToString()?  

That is a method of ANY object.
0
 
LVL 9

Expert Comment

by:Sreedhar Vengala
ID: 24128731
As Jensfiederer said:
If you need a string value that should be doable. The watch window tends to display values by calling .ToString on the object. If the value in the watch window is the string you want then you should be able to get it by simply calling ToString.

var item = e.Item.DataItem.ToString();

You'd need to do a null check on the various properties as well.
0
 

Accepted Solution

by:
Turgeson earned 0 total points
ID: 24130233
I tried that but it didn't work like I needed it to.  It did create a non-null object with properties and values but it didn't give me a way to access them in my code. If I put a break in the event handler and run item.SubCategory in the immediate window and it gives me nothing (no error, empty string, null), just nothing. After a lot of trial and error I was able to it to work with this using Reflection:

object oSubCategory = e.Item.DataItem.GetType().GetProperties()[2].GetValue(e.Item.DataItem, null); // 2 = SubCategory

and then use the .ToString() method on the object. Kind of a round about way to a property but it works in the context I need.
0

Featured Post

Webinar: Aligning, Automating, Winning

Join Dan Russo, Senior Manager of Operations Intelligence, for an in-depth discussion on how Dealertrack, leading provider of integrated digital solutions for the automotive industry, transformed their DevOps processes to increase collaboration and move with greater velocity.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question