Search code examples
c#gridviewdrop-down-menurepeater

how to assign a datasource to a dropdownlist inside a repeater in a gridview ASP.net with C#


Here is my aspx page : i want to bind a column to Dropdownlist but i cant find Repeater("Repeater1") in back-end code. Please Help !

   <asp:GridView ID="gridViewAllotment" CssClass="table table-striped" runat="server" 
                        AutoGenerateColumns="false" GridLines="None" BorderColor="#999999" 
                        BorderStyle="Groove">
                        <Columns>
                        <asp:TemplateField HeaderText="Traffic Police">
                            <ItemTemplate>
                                <%# Eval("U_Name") %>
                            </ItemTemplate>
                        </asp:TemplateField>

                        <asp:TemplateField HeaderText="Traffic Junction">
                         <ItemTemplate>

                       <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound = "Test">
                            <ItemTemplate>
                            <asp:DropDownList ID="ddl_TrafficJunction" runat="server" DataTextField="Junction">            
                            </asp:DropDownList>
                          </itemTemplate>
                        </asp:Repeater>                          
                        </itemTemplate>                            
                        </asp:TemplateField>
                  </Columns>
                </asp:GridView>        

Here is the Back end code:

public partial class JunctionAllotment : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { gridViewAllotment.DataSource = AllotmentLogic.SelectAllTrafficPolices();
gridViewAllotment.DataBind();

    Repeater1.DataSource = RepSource();
    Repeater1.DataBind();
}

public List<string> RepSource()
{
    DataTable data = (DataTable)AllotmentLogic.SelectAllTrafficPolices();
    var j = data.Rows.Count;
    List<string> rep = new List<string>();
    for (int i = 0; i < j ; i++)
    {
        rep.Add(i.ToString());
    }
    return rep;
}

public void FillDropdown(DropDownList ddl)
{
    DataTable dt = AllotmentLogic.SelectTrafficJunction();

    foreach (DataRow row in dt.Rows)
    {
        if (row["TrafficJunction_Name"].ToString() != null)
        {
            ddl.Items.Add(row["TrafficJunction_Name"].ToString());
        }
    }
}

In backend code it says "Repeater1" does not exists in current context.


Solution

  • This piece of code is highly suspect. This code says the GridView needs one or more DropDownLists for each row

        <asp:TemplateField HeaderText="Traffic Junction">
          <ItemTemplate>
            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound = "Test">
              <ItemTemplate>
                <asp:DropDownList ID="ddl_TrafficJunction" runat="server"
                                  DataTextField="Junction">            
                </asp:DropDownList>
              </ItemTemplate>
            </asp:Repeater>                          
          </ItemTemplate>                            
        </asp:TemplateField>
    

    I think this is more inline with what you're trying to do:

        <asp:TemplateField HeaderText="Traffic Junction">
          <ItemTemplate>
              <asp:DropDownList ID="ddl_TrafficJunction" runat="server"
                                DataTextField="Junction">            
              </asp:DropDownList>
          </ItemTemplate>                            
        </asp:TemplateField>
    

    Then in the code behind(Sorry for the VB - but C# should be simple enough to convert)

        Private Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound
          If e.Row.RowType = DataControlRowType.DataRow Then
            Dim ddl As DropDownList = e.Row.FindControl("ddl_TrafficJunction")
    
            ddl.DataSource = CType(AllotmentLogic.SelectTrafficJunction(), DataTable)
            ddl.DataBind()
          End If
        End Sub