4

プログラムの管理者が、ユーザーが入力して送信するフォームのカスタムフィールドを定義できるASP.NETアプリケーションを作成しています。

管理者は、ユーザーが入力できるように、チェックボックス、ラジオボタン、テキストボックス、テキスト領域などのさまざまなタイプのフィールドを定義する必要があります。管理者は、これらのカスタムフィールドが必須かどうかを定義することもできます。

私は現在計画段階にあり、これらのカスタムフィールド定義をデータベースに保存する方法と、それらをレンダリングして機能させる方法について疑問に思っています。

編集

これらの動的に作成されたフォームフィールドを使用してエンドユーザーによって送信されたフォームデータも、データベースに保持する必要があります。

どうすればこの問題に取り組むことができますか?

4

6 に答える 6

6

これは、概念実証のために私が実際にすばやく作成したものです。

DynamicForms.zip

VS2008SP1を組み込みました。appdataフォルダーにsqlserverdbがあるため、これを実行する場合はsqlexpressが役立ちます。

私はこれを素早く作ったので、かなりずさんです。

于 2009-05-13T14:00:05.673 に答える
4

これを実行しなかった場合、または実際にそのようなことをしなかった場合、DB構造には、コントロールのタイプ、名前、値のタイプ(検証済みの場合)、検証方法(必要な場合)が含まれる可能性があります。次に、必要なコントロールのレコード/データセットを読んでいるときに、レコードセットのコントロールタイプを変換された値と比較して、それをWebフォームに追加します。

例えば:

if(drow["ControlType"].ToString().ToUpper() == "TEXTBOX")
{
    Label lbl = new Label();
    lbl.Text = drow["ControlLabel"].ToString();
    TextBox txt = new TextBox();

    //TO GET THE VALUE ON POSTBACK LATER
    txt.ID = drow["ControlID"].ToString();

    //PROBABLY NOT NECESSARY
    Div myDiv = new Div();
    myDiv.Controls.Add(lbl);
    myDiv.Controls.Add(txt);

    //ADD THE DIV ABOVE TO THE FORM/PANEL/DIV/ETC.
    MyForm.Controls.Add(myDiv);
}

これは理論上、テキストボックスコントロールの横にラベルを配置します。Divが機能するかどうかはわかりませんが、CheckBox、TextBox、Labelなどでこのタイプの処理を実行できます。

コントロールとラベルがページに表示されたら、サーバーに値をDBに保存させるための何らかのアクションが必要になります。テーブルと列の名前をオブジェクトのリストとともに保存することをお勧めします。次に、フォームフィールドを挿入用のDB列にマップします。(この説明は200,000フィートのようなものであることに注意してください)

于 2009-05-11T20:36:56.510 に答える
2

次の基本構造が必要になる可能性があります:Form、Field、FieldType。各フィールドの構成を保存できるように、それぞれにビジネスオブジェクトとデータテーブルが必要です。

フィールドごとに個別に追跡できるように、フィールドに設定可能ないくつかのプロパティ(必須など)が必要になる場合があります。

次に、データレイヤーを読み取ることができる何らかのユーティリティが必要になります。次に、各フィールドとフィールドタイプについて、作成するコントロールのタイプと、現在のページにコントロールを追加する方法を確認します。

メインページでasp:PlaceHolderタグを使用すると、フォーム作成ユーティリティを使用して、このプレースホルダーにコントロールを動的に追加できます。

最後に、生成されるフォームのさまざまな部分に対していくつかのクラスを含むスタイルシートを作成して、クライアントが生成するコントロールのテーブルのフォントや間隔などをカスタマイズできるようにすることをお勧めします。

編集:

フォームに入力されたデータを永続化する必要がある場合は、カスタマイズ可能なデータレイヤーを使用するかどうかを決定する必要があります。ALTER TABLEスクリプトを使用してクライアントが必要に応じてデータベースに列を追加できるようにする空のデータベーステーブルを作成してから、どのコントロールがどの列にバインドするかを設定できます。コントロールからデータベース列へのこのマッピングは、データを正しく保存するために重要です。

于 2009-05-11T20:36:33.110 に答える
0

すべてのコントロールをインスタンス化してページに追加できます。例:

 Label label = new Label();
 CheckBox check = new CheckBox();

その後、任意のコンテナのControlsプロパティにコントロールを追加する必要があります。

Panel1.Controls.Add(label);

ポストバック後にコントロールを取得するには、メソッドFindControlを使用できます。

TextBox name = (TextBox) Panel1.FindControl("name of control");
于 2009-05-11T20:30:32.773 に答える
0

他の人が言っているように、実行時にASP.NETページにコントロールを動的に追加することによってこれを行う方法は間違いなくあります。

または、 Microsoft Infopathを使用したことはありませんが、聞いたことから、これはあなたがやろうとしていることのかなりの部分を実行します(つまり、スーパーユーザーがフォーム/アンケートをデザインしてWebに配置し、データを収集できるようにします)後で戻って)

クライアントに適切なMicrosoftOfficeエディションがある場合は、すでにInfoPathがインストールされている可能性があります。

于 2009-05-11T20:40:38.483 に答える
0

私は前にこれに取り組みました。これには2つのテーブルを使用しました。

KeyField_Master:フィールド名、タイプ、および必須かどうか。

KeyField_Details :(値と説明)の観点からカスタムフィールドの値を格納します。

Page_Loadイベントを使用して、そのフィールドを作成します

if (keyField_type == "T") // Textbox
{
   txtBox.Attributes.Add("Type", "T"); // type of field for validation
   txtBox.Attributes.Add("IsKeyField", "Y"); // to mark it as a custom field
   if (isMandatory == "Y")
     txtBox.Attributes.Add("IsMandatory", "Y"); // is it mandatory

   // you could set layout of these controls using HTML Tables or any other way you prefer.

  htmlCell.Controls.Add(txtBox);
  htmlRow.Cells.Add(htmlCell);
  tbHTML.Rows.Insert(2, htmlRow);
}
else if // other controls type
{
  // ...
}

また、 「動的に作成されたコントロールを検証する方法」という質問を参照することもできます。 この質問はその手順に関連していますか?

また、上記の質問で説明したように、検証はクライアント側で行うことができますか?または、作成したフィールドをリストに保存することでサーバー側で、送信時にそのリストを確認できます。

于 2009-05-13T14:28:08.997 に答える