Dropdownlist Inside DetailsView Control ASP.NET 2.0

Hi Gang,

I’m trying to implement simple detailsview control which contains dropdownlist inside edittemplate as below


        <asp:DetailsView ID="dtlSample" runat="server" AutoGenerateEditButton="true" AutoGenerateRows="false" OnModeChanging="dtlSample_ModeChanging">
          <Fields>
            <asp:TemplateField HeaderText="Name">
              <ItemTemplate>
                <%# Eval("Name") %>
              </ItemTemplate>
              <EditItemTemplate>
                <asp:TextBox ID="txtName" Text='<%# Eval("Name") %>' runat="server"></asp:TextBox>
              </EditItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Age">
              <ItemTemplate>
                <%# Eval("Age") %>
              </ItemTemplate>
              <EditItemTemplate>
                <asp:DropDownList ID="ddlAge" runat="server"></asp:DropDownList>
              </EditItemTemplate>
            </asp:TemplateField>
          </Fields>
        </asp:DetailsView>

Now, whenever some tries to update detailsview control it should show me dropdownlist for age column and select the current value. For this I’m trapping ModeChanging event as below.


  protected void LoadDropdownbox(DropDownList ddlCtrl)
  {
    ddlCtrl.Items.Add(new ListItem("24"));
    ddlCtrl.Items.Add(new ListItem("25"));
    ddlCtrl.Items.Add(new ListItem("26"));
    ddlCtrl.Items.Add(new ListItem("27"));
    ddlCtrl.Items.Add(new ListItem("28"));
  }

  protected void dtlSample_ModeChanging(object sender, DetailsViewModeEventArgs e)
  {
    if (e.NewMode == DetailsViewMode.Edit)
    {
      DropDownList ddlGetAge = (DropDownList)dtlSample.FindControl("ddlAge");
      LoadDropdownbox(ddlGetAge);
            ddlGetAge.Items.FindByText(dtlSample.Rows[0].Cells[1].Text).Selected = true;

    }
  }

But the problem is this code


DropDownList ddlGetAge = (DropDownList)dtlSample.FindControl("ddlAge");

return null. Does anyone have solution?

Please advice.

You need to search within the right container for your control. IIRC, there is a TemplateContainer property of the details view meant for just this scenario.

The other option is to make the ddl register it’s changes to something global when it changes.

Guys,
I found the answer so just thought why not help others with the same problem

Here is the code


        <asp:DetailsView ID="dtlSample" runat="server" DataSourceID="objDv" AutoGenerateEditButton="true" AutoGenerateRows="false">
          <Fields>
            <asp:TemplateField HeaderText="Name">
              <ItemTemplate>
                <%# Eval("Name") %>
              </ItemTemplate>
              <EditItemTemplate>
                <asp:TextBox ID="txtName" Text='<%# Eval("Name") %>' runat="server"></asp:TextBox>
              </EditItemTemplate>
            </asp:TemplateField>

            <asp:TemplateField HeaderText="Age">
              <ItemTemplate>
                <%# Eval("Age") %>
              </ItemTemplate>
              <EditItemTemplate>
                <asp:DropDownList ID="ddlAge" runat="server" SelectedValue='<%# Bind("Age") %>' DataSourceID="objDs"></asp:DropDownList>
              </EditItemTemplate>
            </asp:TemplateField>
          </Fields>
        </asp:DetailsView>

        <asp:ObjectDataSource ID="objDs" TypeName="Populate" SelectMethod="GetItems" runat="server"></asp:ObjectDataSource>
        <asp:ObjectDataSource ID="objDv" TypeName="Populate" SelectMethod="GetRecord" UpdateMethod="UpdateRecord" runat="server">
          <UpdateParameters>
            <asp:ControlParameter Name="Name" ControlID="dtlSample$txtName" PropertyName="text" />
            <asp:ControlParameter Name="Age" ControlID="dtlSample$ddlAge" PropertyName="selectedvalue" />
          </UpdateParameters>
        </asp:ObjectDataSource>

This detailsview control displays name and age of and allows editing. Here is the code for class “Populate”


public class Populate
{
  private static DataTable dtSample = new DataTable();

  public static ArrayList GetItems()
  {
    ArrayList arrList = new ArrayList();
    arrList.Add("24");
    arrList.Add("25");
    arrList.Add("26");
    arrList.Add("27");
    arrList.Add("28");

    return arrList;
  }

  public static void Initialize()
  {
    if (dtSample.Rows.Count == 0)
    {
      DataColumn cCol = new DataColumn("Name");
      dtSample.Columns.Add(cCol);
      cCol = new DataColumn("Age");
      dtSample.Columns.Add(cCol);

      DataRow rRow = dtSample.NewRow();
      rRow["Name"] = "Bhavesh Patel";
      rRow["Age"] = "25";

      dtSample.Rows.Add(rRow);
    }
  }

  public static DataTable GetRecord()
  {
    Initialize();
    return dtSample;
  }

  public static DataTable UpdateRecord(String Name, String Age)
  {
    dtSample.Rows[0]["Name"] = Name;
    dtSample.Rows[0]["Age"] = Age;
    return dtSample;
  }
}