ASP.NET动态复选框或下拉列表

时间:2012-12-12 15:15:37

标签: c# asp.net

我在ASP.NET站点中有一个gridview。

现在有一个TemplateField工作正常 - 这是一个调查表单,默认情况下使用文本框来回答问题:

<asp:TemplateField HeaderText="" Visible="True" >
   <ItemTemplate>
      <asp:TextBox ID="txtAnswer" Text='<%# Bind("Answer") %>' runat="server" 
       TextMode="MultiLine" Height="76px" MaxLength="2000" Width="377px">
       </asp:TextBox>
    </ItemTemplate>
 <EditItemTemplate>
       <asp:TextBox ID="txtAnswer" Text='<%# Bind("Answer") %>' runat="server" 
       TextMode="MultiLine" Height="76px" MaxLength="2000" Width="377px">
       </asp:TextBox>
 </EditItemTemplate>
 </asp:TemplateField>

现在的要求是添加可由下拉列表回答的新问题。我已经知道如何做到这一点(将问题编号传递给函数并检查存储在另一个表中的下拉式答案的存在),但我正在努力根据问题类型动态更新模板字段......有什么建议吗?

更新

我设法通过辅助函数部分地完成了这项工作。 (可能不是我最好的代码,但它几乎完成了工作)问题是我得到一个字符串告诉我输出中的类型而不是实际控件(分别是Textboxes或dropdownlists)...我怎么能纠正这个?

  public Control GetAnswerControl(string QuestionID, string Answer)
{
    List<ListItem> lstOptions = new List<ListItem>();

    SqlCommand cmd = new SqlCommand("pDropDownAnswers_Get", functions.NewSupplierRequest);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@QuestionID", SqlDbType.Int);
    cmd.Parameters["@QuestionID"].Value = Int32.Parse(QuestionID);

    try
    {
        functions.NewSupplierRequest.Open();
        SqlDataReader r = cmd.ExecuteReader();
        while (r.Read())
        {
            lstOptions.Add(new ListItem(r["DropDownAnswer"].ToString(), r["DropDownAnswer"].ToString()));
        }
    }
    catch (Exception err)
    {
        this.lblError.Text = err.Message;
    }
    finally
    {
        functions.NewSupplierRequest.Close();
    }

    if (lstOptions.Count == 0)
    {
        TextBox tb = new TextBox();
        tb.ID = "txtAnswer";
        tb.Text = Answer;
        tb.TextMode = TextBoxMode.MultiLine;
        tb.Height = 76;
        tb.Width = 377;
        tb.MaxLength = 2000;

        return tb;
    }
    else
    {
        DropDownList dl = new DropDownList();
        dl.DataSource = lstOptions;
        dl.DataBind();
        dl.SelectedValue = Answer;
        return dl;
    }
}

1 个答案:

答案 0 :(得分:0)

我最终采用了不同的方法......

  1. 首先,我在gridview中设置了一些隐藏字段和占位符,以保存问题ID和答案ID
  2. 然后我创建了一个辅助函数来循环遍历gridview的行,抓取ID并从隐藏的字段中回答。
  3. 从代码隐藏中将控件添加到占位符实际上将它们格式化为控件,而不是我得到的字符串。