0

私は自分の会社のアプリケーションを開発していますが、これを行うための最良のアプローチは何かを考えています。

同社はすでに、複数の選択肢がある約 15 の質問からなるアンケートのページを用意しています。今、管理セクションから既存の質問とそのオプションを変更したり、質問やオプションを追加したりできるように、アプリケーションを開発するように依頼されました。

これを行うための最良のアプローチが何であるかはわかりません。管理セクションに既存の質問と回答オプションを表示できるページを作成することを考えていました。変更した場合はデータベースで直接変更でき、質問を追加した場合はデータベースにカスタム質問フィールドを作成できます. 回答オプションの場合、テキストボックス、チェックボックス、ラジオボタンなどのオプションを動的に生成するため、データベースにフィールドを作成しません。ユーザーが回答を選択すると、選択した回答のみをデータベースに配置します。

編集

=======

オプションを追加するための3つのオプション(チェックボックス、ラジオ、テキストボックス)のみを管理者に提供したいだけです

ジェネリックを使用して動的にコントロールを作成する方法について混乱しています。管理者のように、この CreateControls(TextBox, NoOfOptions, List) のようなメソッドで値を渡すことができます

私はまだこれに取り組み始めておらず、思考プロセスの最初の段階で立ち往生しているため、質問にコードを追加していないことを許してください。

このアプリケーションには、VS2010、.Net 4.0、SQL サーバー 208 R2 を使用しています。

ご意見をお聞かせください。実際の例のリンクをいただければ幸いです。

4

2 に答える 2

1

これを行う最も良い方法は、Web コントロールを作成することです。Repeater の ItemTemplate 内に配置します。リピーターはデータ バインディング ジョブを実行し、Web コントロールは質問と各質問の回答フィールドをレンダリングします。

現時点で私が想像できるのは、あなたのデータソース(リピーターにバインドされているものには少なくとも次のものが必要です:

  1. QuestionID - これは質問を識別するためのものです
  2. 質問 - これには質問が含まれます
  3. ResponseType - これは、テキストボックス、ラジオ、またはチェックボックスを回答フィールドとしてレンダリングするかどうかを決定する単なるフラグです

Web コントロールには、少なくとも次のプロパティが必要です。

  1. 質問ID
  2. 質問
  3. 応答タイプ
  4. ユーザーの回答
  5. Choices - 選択のコレクション

リピーターの itemdatabound イベント中に、itemtemplate で webcontrol インスタンスを取得します。バインドされた DataItem からの questionid と question をそれぞれの Web コントロール プロパティに割り当てます。次に、AnswerType を確認します。ラジオまたはチェックボックスの場合、この特定の質問 ID の選択肢を db/xml から取得し、それを Web コントロールの Choices プロパティに割り当てます。

今、webcontrol のRenderContentsイベントで:

  1. 質問を書いてください
  2. AnswerType が textbox の場合、textarea または textbox 要素を書き込みます
  3. AnswerType がラジオまたはチェックボックスの場合、Choices プロパティを反復して、それぞれの入力タグをレンダリングします。

とにかく、このアプローチを使用すると、管理者は各質問に無制限の数の選択肢を設定できます. 各質問には柔軟性があります。IQ テストのような選択肢として、問題に画像を添付することもできます。

ただし、ポストバック、フィールド検証などでデータを維持するなど、Web コントロールでコーディングする必要があるものは他にもたくさんあります。

于 2013-04-13T09:50:25.700 に答える
1

これに関して 1 つの考えがあります。この種の機能は既に実行していますが、私の場合、各カスタム質問はテキストボックスのみにバインドされています。

あなたの場合、次の手順に従うことができます:

管理終了:

各コントロールを一意の値 (番号またはコントロール名) で指定します。これを質問 ID とともにテーブルに保存します。

クライアント側:

1.) リピーターを取ります。項目テンプレートでは、次のコントロールを取ります。

a.)ラベル (カスタム質問)

b.)textboxes (目に見える false)

c.)チェックボックス (false を表示)

d.) ラジオボタン (false を表示) など

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 に答える