Check if a column with a given name exists in a datarow

23,403

Solution 1

First, i would use codebehind if it's getting complicated (i use it almost always). Here i would use the ListView's ItemDataBound event which is triggered for every item:

protected void ListView1_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        // assuming you have an ItemTemplate with a label where you want to show this
        Label lblInfo = (Label) e.Item.FindControl("LblInfo");
        DataRowView rowView = (DataRowView)e.Item.DataItem;
        if (rowView.Row.Table.Columns.Contains("Phone"))
        {
            lblInfo.Text = "we have the phone property";
        }
        else
        {
            lblInfo.Text = "no phone available";
        }
    }
}

That makes the code much more readable, maintainable, debuggable and type safe.

Solution 2

You can check this in OnItemDataBound.

 protected void lstSample_OnItemDataBound(object sender, ListViewItemEventArgs e)
    {
        Label lblText = null;
        Boolean isColumnExists = false;
        if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            DataRowView dr = (DataRowView)e.Item.DataItem;
            isColumnExists  = dr.DataView.Table.Columns.Contains("Hello");
            lblText = (Label)e.Item.FindControl("lbltext");
            if (isColumnExists)
            {

                lblText.Text = dr.Row["Hello"].ToString();
            }
            else
            {
                lblText.Text = dr.Row["Movies"].ToString();
            }
        }
    }

Hope this helps!

Share:
23,403
POIR
Author by

POIR

Updated on July 09, 2022

Comments

  • POIR
    POIR almost 2 years

    How can I check if a column exists in result that populate a listview? The listview is populated from a stored procedure.

    This is what I tried but no success:

    <%#  Container.DataItem.GetType().GetProperty("Phone")==null?"phone is null":"we have phone property" #>
    

    or should I use e instead Container.DataItem ?

  • Tim Schmelter
    Tim Schmelter over 10 years
    Don't use Try-Catch as logical operator. This is very inefficient.
  • Tim Schmelter
    Tim Schmelter over 10 years
    Not the Try-Catch affects performance but an exception can. And since you're looping probably many items with several columns here it could indeed be performance critical. However, even if it doesn't hurt performance it's a bad habit to kick. No, exceptions are never the right tool for normal flow control. Exceptions should only be used to indicate that a function/method can't fulfil its contract due to external reasons.