我正在为我的公司开发一个应用程序,我坚持认为这样做的最佳方法是什么。
该公司已经有一个调查页面,大约有15个问题,有多种选择。现在我被要求开发一个应用程序,以便从管理部分他们可以修改现有问题和他们的选项,也可以添加更多问题和选项。
我不确定这样做的最佳方法是什么。我想在管理部分创建一个页面,他们可以看到现有问题和答案选项,如果他们修改它我可以直接在数据库中更改它,如果他们添加更多问题,我可以在数据库中创建自定义问题字段。对于答案选项,我不会在数据库中创建任何字段,因为我将动态生成选项,如文本框,复选框,单选按钮等。当用户选择答案时,我会将精选的答案放入数据库中。
=======
我很困惑如何使用泛型动态创建控件。像admin一样可以传递方法中的值,如CreateControls(TextBox,NoOfOptions,List)
请原谅我没有在我的问题中添加任何代码,因为我还没有开始研究这个问题而且陷入了思考过程的第一阶段。
我正在为此应用程序使用VS2010,.Net 4.0,SQL server 208 R2。
请指教。任何工作示例链接将不胜感激。
答案 0 :(得分:1)
我对此有一个想法。我已经完成了这种功能,但在我的情况下,每个自定义问题都只与文本框绑定。
在您的情况下,我们可以按照以下步骤操作:
管理员结束:
使用唯一值指定每个控件,它可以是数字或控件名称。请在带有问题ID的表中进行此操作。
客户端:
1。)使用repeater.In项目模板采取以下控制:
a。)标签(您的自定义问题)
b。)文本框(可见假)
c。)复选框(可见假)
d。)radiobuttons(可见假)等。
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;
}
}
}
希望这对你有所帮助: - )
答案 1 :(得分:1)
最好的方法是编写一个webcontrol。将它置于Teh Repeater的ItemTemplate中。转发器将执行数据绑定作业,其中webcontrol将呈现每个问题的问题和答案字段。
我可以想象的是,您的数据源(必须至少包含转发器的数据源)
webcontrol必须至少具有以下属性:
在转发器的itemdatabound事件期间,获取itemtemplate中的webcontrol实例。将绑定的DataItem中的questionid和问题分配给相应的webcontrol属性。然后检查AnswerType。如果它是radio或checkbox,则从db / xml中检索此特定questionid的选项,并将其分配给webcontrol Choices属性。
现在在webcontrol的RenderContents
事件中:
无论如何,如果您使用此方法,管理员可以为每个问题设置无限数量的选择。每个问题都有灵活性。图像可以附加到问题上,即使像IQ测试这样的选择。
但是,webcontrol中的代码还有很多,比如在回发,字段验证等方面维护数据。