1

フォームを作成しようとしています。フォーム コントロールの名前は常に同じになります。ただし、コントロールの種類は変更されます。たとえば、「first_name」という名前のコントロールがあります。ページが初期化されると、コントロールのタイプ (TextBox、DropDownList、または CheckBox) を示すデータがデータベースから取得されます。次に、フォームがページ上に動的に作成されます。ビューステートを維持するために、OnInit メソッドでコントロールを作成しました。

protected override void OnInit(EventArgs e)
{
    Control first_name;
    string ControlType = GridView1.Rows[0].Cells[1].Text;
    switch (ControlType)
    {
        case("TextBox"):
            first_name = new Control() as TextBox; first_name.ID = "first_name"; this.Controls.Add(first_name);
            break;
        case("DropDownList"):
            first_name = new Control() as DropDownList; first_name.ID = "first_name"; this.Controls.Add(first_name);
            break;
        case("CheckBox"):
            first_name = new Control() as CheckBox; first_name.ID = "first_name"; this.Controls.Add("first_name");
            break;
    }
}

次に、コントロールをページにレンダリングします。

protected override void Render(HtmlTextWriter writer)
{
    writer.Write("first_name: ");
    first_name.RenderControl(writer);
}

次に、コントロールに値を割り当ててみます。ここで問題が発生します。グローバルに宣言されると、コントロールとして宣言され、それらの値を保持することがわかっています。

関数内からグローバルに宣言する方法、またはグローバルに宣言された後にコントロールのタイプを変更する方法はありますか?

protected void Page_Load(object sender, EventArgs e)
{
    switch (first_name.GetType().ToString())
    {
        case ("TextBox"):
            first_name.Text = "Your First Name...";
            break;
        case ("DropDownList"):
            first_name.Items.Add("Jason");
            first_name.Items.Add("Kelly");
            first_name.Items.Add("Keira");
            first_name.Items.Add("Sandi");
            first_name.Items.Add("Gary");
            break;
        case ("CheckBox"):
            first_name.Checked = true;
            break;
    }        
}

これを達成できる方法を教えてください。

4

3 に答える 3

6

あなたの中でOnInitあなたはすべきであり、2番目はただ戻るのでそうではnew TextBox()ありません。new Control() as TextBoxnull

あなたPage_Loadはこのようなものになります:

if (first_name is TextBox)
    ((TextBox)first_name).Text = "Your First Name...";
else if (first_name is DropDownList)
{
    var drp = (DropDownList)first_name;
    drp.Items.Add();
    // ...
}
于 2012-11-13T14:56:33.257 に答える
1

first_nameタイプ固有のプロパティにアクセスするには、switch/caseステートメント内で適切なタイプにキャストする必要があります。

protected void Page_Load(object sender, EventArgs e)
{
    switch (first_name.GetType().ToString())
    {
        case ("TextBox"):
            (first_name as TextBox).Text = "Your First Name...";
            break;
        case ("DropDownList"):
            (first_name as DropDownList).Items.Add("Jason");
            (first_name as DropDownList).Items.Add("Kelly");
            (first_name as DropDownList).Items.Add("Keira");
            (first_name as DropDownList).Items.Add("Sandi");
            (first_name as DropDownList).Items.Add("Gary");
            break;
        case ("CheckBox"):
            (first_name as CheckBox).Checked = true;
            break;
    }        
}
于 2012-11-13T14:56:10.073 に答える
0

Control静的型として使用し、それぞれで別の変数を使用できますcase

Control ctrl;
switch(type)
{
  case "TextBox":
    var box = new TextBox();
    box.Text = "...";
    ctrl = box;
    break;
}
Page.Controls.Add(ctrl);

どうやら - オーバーライドされたRenderメソッドを見ると - ASP.NET Web フォームが行う多くのことを手作業で行っているようです。のコレクションctrlに (または任意のコントロールを)追加するだけです。PageControls

メソッドは、オーバーライドしない限り、コレクションのPage.Renderすべての要素をレンダリングします。Controls

于 2012-11-13T14:57:17.963 に答える