0

我正在为我的公司开发一个应用程序,我一直在思考什么是最好的方法。

该公司已经有一个页面用于调查大约 15 个带有多项选择的问题。现在我被要求开发一个应用程序,以便他们可以从管理部分修改现有问题及其选项,也可以添加更多问题和选项。

我不确定这样做的最佳方法是什么。我正在考虑在管理部分创建一个页面,他们可以在其中查看现有问题和答案选项,如果他们修改它,我可以直接在数据库中更改它,如果他们添加更多问题,我可以在数据库中创建自定义问题字段. 对于答案选项,我不会在数据库中创建任何字段,因为我将动态生成选项,如文本框、复选框、单选按钮等。当用户选择答案时,我会将选定的答案放入数据库中。

编辑

=======

我只想为管理员提供 3 个添加选项的选项(复选框、收音机、文本框)

我对如何使用泛型动态创建控件感到困惑。像管理员一样可以在方法中传递值,例如 CreateControls(TextBox, NoOfOptions, List)

请原谅我没有在我的问题中添加任何代码,因为我还没有开始研究这个并且停留在思考过程的第一阶段。

我为此应用程序使用 VS2010、.Net 4.0、SQL server 208 R2。

请指教。任何工作示例链接将不胜感激。

4

2 回答 2

1

最漂亮的方法是编写一个 web 控件。将它放在中继器的 ItemTemplate 中。转发器将完成数据绑定工作,其中 web 控件将呈现每个问题的问题和答案字段。

我现在可以想象的是,您的数据源(绑定到中继器必须至少具有:

  1. QuestionID - 用于识别问题
  2. 问题 - 这包含问题
  3. ResponseType - 这只是一个标志,用于确定是否将文本框、单选框或复选框呈现为答案字段/s

Web 控件必须至少具有以下属性:

  1. 问题ID
  2. 问题
  3. 响应类型
  4. 用户回答
  5. 选择 - 选择的集合

在repeater的itemdatabound事件期间,获取itemtemplate中的webcontrol实例。将 questionid 和 question 从绑定的 DataItem 分配给相应的 webcontrol 属性。然后检查AnswerType。如果它是单选框或复选框,则从 db/xml 中检索此特定 questionid 的选项,并将其分配给 webcontrol Choices 属性。

现在在 webcontrol 的RenderContents事件中:

  1. 写下问题
  2. 如果 AnswerType 是 textbox,则写入 textarea 或 textbox 元素
  3. 如果 AnswerType 是单选或复选框,则迭代 Choices 属性以呈现相应的输入标签。

无论如何,如果您使用这种方法,管理员可以为每个问题设置无限数量的选择。每个问题都可以具有灵活性。图像可以附加到问题上,甚至像那些智商测试那样的选择。

但是,在 web 控件中还有很多代码需要编写,例如维护回发数据、字段验证等。

于 2013-04-13T09:50:25.700 回答
1

我对此有一个想法。我已经完成了这种功能,但在我的情况下,每个自定义问题仅与文本框绑定。

在您的情况下,我们可以按照以下步骤操作:

管理员端:

使用唯一值指定每个控件,它可以是数字或控件名称。将其保存在带有问题 ID 的表中。

客户端:

1.) 采用中继器。在项目模板中采用以下控件:

a.)标签(您的自定义问题)

b.)文本框(可见错误)

c.)复选框(可见错误)

d.) 单选按钮(可见错误)等。

2.)将此转发器与问题表绑定。

3.) 现在触发 rowdatabound 事件并根据问题 id 设置控件的可见性。

如果您有任何疑问,请询问。

更新 :

现在请检查我昨天讨论过的整个过程的实施:

XML 文件用作测试数据库:

<?xml version="1.0" encoding="iso-8859-1"?>

 <catalog>
  <cd>
  <id>1</id>
  <title>Question 1</title>
  <ctrl>1</ctrl>
 </cd>
 <cd>
  <id>2</id>
  <title>Question change</title>
  <ctrl>2</ctrl>
 </cd>
  <cd>
   <id>3</id>
   <title>Question 3</title>
  <ctrl>3</ctrl>
  </cd>
 <cd>
   <id>4</id>
   <title>Question 4</title>
  <ctrl>2</ctrl>
 </cd>

ASPX 页面:

       <asp:Repeater ID="Repeater1" runat="server" 
        onitemdatabound="Repeater1_ItemDataBound">
        <HeaderTemplate>
            <table>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    <asp:Label ID="Label1" runat="server" Text='<%#Eval("id") %>'></asp:Label>
                    <asp:HiddenField ID="HiddenField1" runat="server" Value='<%#Eval("ctrl") %>' />
                </td>
                 <td>
                  <asp:Label ID="Label2" runat="server" Text='<%#Eval("title") %>'></asp:Label>
                 </td>
                <td>
                    <asp:TextBox ID="TextBox1" runat="server" Visible="false"></asp:TextBox>
                </td>
                <td>
                    <asp:RadioButton ID="RadioButton1" runat="server" Checked="true" Text="YES" TextAlign="Left" Visible="false" />
                    <asp:RadioButton ID="RadioButton2" runat="server" Text="NO" TextAlign="Left" Visible="false" />
                </td>
                <td>
                    <asp:CheckBox ID="CheckBox1" runat="server" Visible="false" />
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
      </asp:Repeater>

CS文件:

if (!IsPostBack)
    {
        DataSet ds = new DataSet();
        ds.ReadXml(MapPath("XMLFile.xml"));
        Repeater1.DataSource = ds;
        Repeater1.DataBind();
    }

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
    {
        HiddenField ctrl = (HiddenField)e.Item.FindControl("HiddenField1");
        if (ctrl.Value == "1")//1 for Textbox
        {
            TextBox txtCtrl = (TextBox)e.Item.FindControl("TextBox1");
            txtCtrl.Visible = true;
        }
        else if (ctrl.Value == "3")//3 for Radio Button
        {
            RadioButton rdbYCtrl = (RadioButton)e.Item.FindControl("RadioButton1");
            RadioButton rdbNCtrl = (RadioButton)e.Item.FindControl("RadioButton2");
            rdbYCtrl.Visible = true;
            rdbNCtrl.Visible = true;
        }
        else if(ctrl.Value == "2")//2 for Chackbox
        {
             CheckBox chkCtrl = (CheckBox)e.Item.FindControl("CheckBox1");
             chkCtrl.Visible = true;
        }

    }
}

希望现在对您有所帮助:-)

于 2013-04-11T10:34:09.160 回答