Search code examples
asp.netdetailsview

DetailsView control not showing up after DataBind()


I have the following detailsview in my asp.net web application. What it should show is a string with an edit link under, when the edit link is selected then the string turns into a dropdown list that is populated with some options. When there is no data in the Enumerable the DetailsView does not show up (not even the edit link)...

 <asp:DetailsView ID="dvAwardType" 
            runat="server" 
            AutoGenerateRows="False" 
            Width="100%"
            SkinID="SampleDetailsView" 
            CssSelectorClass="PrettyDetailsView" 
            AutoGenerateEditButton="True" DataKeyNames="guidRequirementId"
            OnModeChanging="dvAwardType_ModeChanging"
            OnItemUpdating="dvAwardType_ItemUpdating">
            <FieldHeaderStyle Font-Bold="True" Width="150px" />
            <Fields>
                <asp:TemplateField HeaderText="Pool Type">
                    <ItemTemplate>
                        <%#Eval("strAwardType")%>
                    </ItemTemplate>
                    <EditItemTemplate>
                            <asp:DropDownList ID="ddlAwardType" 
                                runat="server">
                            <asp:ListItem Text="" Value="" />
                            <asp:ListItem Text="Small Business" Value="SB" />
                            <asp:ListItem Text="Large Business" Value="LB" />
                        </asp:DropDownList>
                    </EditItemTemplate>
                </asp:TemplateField>
            </Fields>
        </asp:DetailsView>


 protected void Page_Load(object sender, EventArgs e)
{

    dvAwardType.DataSource = GetData(RequirementId);
    dvAwardType.DataBind();
}

private IEnumerable GetData(Guid guidRequirementId)
{
    var data = Requirement.BusinessSize(guidRequirementId)
        .Select(o =>
            new
            {
                guidRequirementId = o.guidRequirementId,
                strAwardType = (o.strBusinessSize != null) ? TranslateSize(o.strBusinessSize) : ""
            }
            );
    return data;
}

private string TranslateSize(string strSize)
{
    string strTranslated = string.Empty;
    switch(strSize.Trim())
    {
        case "SB": strTranslated = "Small Business";
            break;
        case "LB": strTranslated = "Large Business";
            break;
    }
    return strTranslated;
}

Solution

  • You need to add an EmptyDataTemplate if you want anything to display in the DetailsView when its data source is empty:

    <asp:DetailsView ID="dvAwardType"  
        runat="server"  
        AutoGenerateRows="False"  
        Width="100%" 
        SkinID="SampleDetailsView"  
        CssSelectorClass="PrettyDetailsView"  
        AutoGenerateEditButton="True" DataKeyNames="guidRequirementId" 
        OnModeChanging="dvAwardType_ModeChanging" 
        OnItemUpdating="dvAwardType_ItemUpdating"> 
        <EmptyDataTemplate>
            There is no data to display
        </EmptyDataTemplate>
    

    You can put whatever you like inside that EmptyDataTemplate. I just included text, but you can put controls, hyperlinks, HTML, etc.