0

I am developing an application for an online test. Currently, I have a gridview with 7 columns: 1 column for the question, 5 more columns for the possible answers, and then a textbox where the student will populate their answer. I would really like to remove the 5 answer columns from my gridview, and instead have one column that is a dropdownlist displaying the 5 potential answers for each question.

I work mostly with SQL and SSRS. I am a beginner with .net and C#.

For example: This code below, where I manually populate list items, works just fine. But my list items will change with each question, so I need to do it dynamically instead of hardcoding values in.

          <asp:TemplateField>
           <ItemTemplate>
            <asp:DropDownList ID="ddlAnswers" runat="server">
            <asp:ListItem Text ="Apple" Value = "A" ></asp:ListItem>
            <asp:ListItem Text ="banana" Value = "b" ></asp:ListItem>
            <asp:ListItem Text ="canary" Value = "c" ></asp:ListItem>
            <asp:ListItem Text ="dairy" Value = "d" ></asp:ListItem>
            <asp:ListItem Text ="elephant" Value = "e" ></asp:ListItem>
            </asp:DropDownList>
        </ItemTemplate>
       </asp:TemplateField>

Again, I am a beginner in .net, but is it possible to do something like what I've posted below?

        <asp:TemplateField>
          <ItemTemplate>
            <asp:DropDownList ID="ddlAnswers" runat="server">
            <asp:ListItem  Value = "gridview1.columnC" ></asp:ListItem>
            <asp:ListItem  Value = "gridview1.ColumnD" ></asp:ListItem>
            <asp:ListItem  Value = "gridview1.ColumnE" ></asp:ListItem>
            <asp:ListItem  Value = "gridview1.ColumnF" ></asp:ListItem>
            <asp:ListItem  Value = "gridview1.ColumnB" ></asp:ListItem>
            </asp:DropDownList>
        </ItemTemplate>
       </asp:TemplateField>

Obviously, I know the syntax is wrong, but is it feasible to do this? Thanks very much!!

Jay Alfred
  • 21
  • 1
  • 3

1 Answers1

0

You can do this in code behind OnRowDataBound of Grid View or with asp:ObjectDataSource

Here I'm giving OnRowDataBound approach. Let us say your gridview looks like

<asp:GridView ID="gridview1" ... OnRowDataBound = "gridview1_OnRowDataBound">
       <Columns>
       <!-- ... Other Columns ... -->
       <asp:TemplateField>
       <ItemTemplate>
           <asp:DropDownList ID="ddlAnswers" runat="server">
           </asp:DropDownList>
       </ItemTemplate>
       </asp:TemplateField>
       <!-- ... Any Other Columns ... -->
       </Columns>
   </asp:GridView>

Code Behind:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[2] { new DataColumn("ColumnA"), new DataColumn("ColumnB"), new DataColumn("ColumnC"), new DataColumn("ColumnD"), new DataColumn("ColumnE"), new DataColumn("ColumnF") });
        dt.Rows.Add("A1", "B1", "C1", "D1", "E1", "F1");
        dt.Rows.Add("A2", "B2", "C2", "D2", "E2", "F2");
        dt.Rows.Add("A3", "B3", "C3", "D3", "E3", "F3");
        dt.Rows.Add("A4", "B4", "C4", "D4", "E4", "F4");
        dt.Rows.Add("A5", "B5", "C5", "D5", "E5", "F5");
        gridview1.DataSource = dt;
        gridview1.DataBind();
    }
}

protected void gridview1_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    //Here you can track all row level controls while binding GridView
    //And you can apply field level logic here
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DropDownList ddlAnswers = (e.Row.FindControl("ddlAnswers") as DropDownList);
        DataTable dt = new DataTable();
        dt.Columns.AddRange(new DataColumn[2] { new DataColumn("AnswerCode"), new DataColumn("AnswerText") });
        dt.Rows.Add("A",  "Apple"   );
        dt.Rows.Add("B", "Banana"  );
        dt.Rows.Add("C", "Canary"  );
        dt.Rows.Add("D", "Dairy"   );
        dt.Rows.Add("E", "Elephant");

        ddlAnswers.DataSource = dt;
        ddlAnswers.DataTextField = "AnswerText";
        ddlAnswers.DataValueField = "AnswerCode";
        ddlAnswers.DataBind();
        ddlAnswers.Items.Insert(0, new ListItem("Please select", string.Empty));

    }
}

See below examples for more understanding:
http://www.aspsnippets.com/Articles/Bind-DropDownList-in-ItemTemplate-of-TemplateField-in-ASPNet-GridView.aspx

http://aspforums.net/Threads/128761/Bind-ASPNet-DropDownList-in-ItemTemplate-of-ASPNet-GridView-in-OnRowDataBound-event/

Bind Data to DropDownList in GridView asp.net

ASP:DropDownList in ItemTemplate: Why is SelectedValue attribute allowed?

Community
  • 1
  • 1
Koti Panga
  • 3,660
  • 2
  • 18
  • 21