1

3 つの DropDownLists (日/月/年) で構成された WebUserControl があります。パブリック プロパティ DateTime BirthDate があります。この WebUserControl をページ (Page_Load) で動的に作成します。読み込んだ WebUserControl のデータを変更し、ページ上のボタンで保存できるようにしたい。

WebUserControl コード:

public DateTime BirthDate { get; set; }

protected void Page_Load(object sender, EventArgs e)
{
    DropDownList dd = new DropDownList();
    DropDownList dm = new DropDownList();
    DropDownList dy = new DropDownList();

    this.Controls.Add(dd);
    this.Controls.Add(dm);
    this.Controls.Add(dy);

    dd.Items.Add(new ListItem("day","0"));
    dm.Items.Add(new ListItem("month", "0"));
    dy.Items.Add(new ListItem("year", "0"));

    dd.Items.AddRange(GetNumericValues(1, 31).ToArray());
    dm.Items.AddRange(GetNumericValues(1, 12).ToArray());
    int yearNow = DateTime.Now.Year;
    dy.Items.AddRange(GetNumericValues(yearNow - 100, yearNow - 17).ToArray());

    dd.DataBind();
    dm.DataBind();
    dy.DataBind();

    if (BirthDate != DateTime.MinValue)
    {
        dd.SelectedValue = BirthDate.Day.ToString();
        dm.SelectedValue = BirthDate.Month.ToString();
        dy.SelectedValue = BirthDate.Year.ToString();
    }
    else
    {                
        dd.SelectedValue = "0";
        dm.SelectedValue = "0";
        dy.SelectedValue = "0";
    }


}

private List<ListItem> GetNumericValues(int from, int to)
{
    List<ListItem> n = new List<ListItem>();
    for (int i = from; i <= to; i++)
    {
        n.Add(new ListItem(i < 10 ? "0" + i.ToString() : i.ToString()));
    }
    return n;
}

ページコード:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BirthDateWebUserControl bc = new BirthDateWebUserControl();
        PanelForm.Controls.Add(bc);
        ViewState["BirthDateWebUserControl"] = bc;
    }
}

protected void Button1_Click(object sender, EventArgs e)
{
    BirthDateWebUserControl bc = (BirthDateWebUserControl)ViewState["BirthDateWebUserControl"];
    LabelResult.Text = bc.BirthDate.ToString("dd/MM/yy");
}

私が間違っていることは何ですか?

ありがとう

4

4 に答える 4

0

あなたが次のようなものを持っているとしましょうUserControl

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Test.ascx.cs" Inherits="YourApplication.Test" %>
<asp:DropDownList ID="ddl1" runat="server" />

目標は、の値を取得および設定できるようにすることです。そうするためDropDownListに、そうすることができるのプロパティを作成しますUserControl

public partial class Test : System.Web.UI.UserControl
{
    public string Value
    {
        get { return ddl1.SelectedValue; }
        set { ddl1.SelectedValue = value; }
    }
}

UserControlその後、他のページのプロパティとして使用できます。

<uc:Test ID="ucTest" runat="server" Value="1" />

または

    protected void Page_Load(object sender, EventArgs e)
    {
        string theValue = ucTest.Value;
    }
于 2012-07-05T16:02:17.910 に答える
0

動的に作成されたコントロールは、すべてのページ ポストバックで、Page PreInit または Init イベントで作成する必要があります。ASP.NET は、Init イベントと Load イベントの間にコントロールのビューステート値を更新します。

于 2012-07-05T15:54:20.720 に答える
0

コントロール + ページの作業バージョンを次に示します。

ユーザーコントロール:

using System;
using System.Collections.Generic;
using System.Web.UI.WebControls;

public partial class BirthDateWebUserControl : System.Web.UI.UserControl
{
    private readonly string ViewStateKey = "BirthDateWebUserControl_VSKEY";
    public DateTime BirthDate
    {
        get
        {
            int day = int.Parse(((DropDownList)this.FindControl("DayDropDown")).SelectedValue);
            int month = int.Parse(((DropDownList)this.FindControl("MonthDropDown")).SelectedValue);
            int year = int.Parse(((DropDownList)this.FindControl("YearDropDown")).SelectedValue);
            return new DateTime(year, month, day);
        }
        set
        {
            ((DropDownList)this.FindControl("DayDropDown")).SelectedValue = value.Day.ToString("00");
            ((DropDownList)this.FindControl("MonthDropDown")).SelectedValue = value.Month.ToString("00");
            ((DropDownList)this.FindControl("YearDropDown")).SelectedValue = value.Year.ToString("00");
        }
    }

    protected void Page_Init(object sender, EventArgs e)
    {
        DropDownList dd = new DropDownList();
        dd.ID = "DayDropDown";
        DropDownList dm = new DropDownList();
        dm.ID = "MonthDropDown";
        DropDownList dy = new DropDownList();
        dy.ID = "YearDropDown";

        this.Controls.Add(dd);
        this.Controls.Add(dm);
        this.Controls.Add(dy);

        if (ViewState[ViewStateKey] == null)
        {

            dd.Items.Add(new ListItem("day", "0"));
            dm.Items.Add(new ListItem("month", "0"));
            dy.Items.Add(new ListItem("year", "0"));

            dd.Items.AddRange(GetNumericValues(1, 31).ToArray());
            dm.Items.AddRange(GetNumericValues(1, 12).ToArray());
            int yearNow = DateTime.Now.Year;
            dy.Items.AddRange(GetNumericValues(yearNow - 100, yearNow - 17).ToArray());

            dd.DataBind();
            dm.DataBind();
            dy.DataBind();

            ViewState[ViewStateKey] = true;
        }
    }

    private List<ListItem> GetNumericValues(int from, int to)
    {
        List<ListItem> n = new List<ListItem>();
        for (int i = from; i <= to; i++)
        {
            n.Add(new ListItem(i < 10 ? "0" + i.ToString() : i.ToString()));
        }
        return n;
    }
}

サンプル ページ コンテンツ:

<asp:Panel ID="PanelForm" runat="server">
</asp:Panel>
<asp:Label ID="LabelResult" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Click" />

サンプル ページのコード ビハインド:

protected void Page_Init(object sender, EventArgs e)
{
    BirthDateWebUserControl bc = new BirthDateWebUserControl();
    bc.ID = "bcInPanel";
    PanelForm.Controls.Add(bc);
}
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // init with some date in case not post back
        ((BirthDateWebUserControl)PanelForm.FindControl("bcInPanel")).BirthDate = new DateTime(1950, 4, 12);
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    var bc = (BirthDateWebUserControl)PanelForm.FindControl("bcInPanel");
    LabelResult.Text = bc.BirthDate.ToString("dd/MM/yy");
} 

考慮すべき点:

  • 動的コントロールを使用する場合、それらを初期化するのに適した場所はPage_Init
  • このような場合 (UserControl)、動的に作成されたサブ コントロールをPage_Init
  • コントロールの初期化に必要なデータを に保存しますViewState。コントロール全体を保存しないでください。

最も重要な:

  • 動的に作成されたコントロールを最初から使用することに意味があるかどうかを質問します。このサンプルでは、​​ユーザー コントロールのドロップダウンを静的に宣言することもできます。それらの操作がはるかに簡単になります( FindControl +正しいタイプへのキャストなどは必要ありません)。
于 2012-07-05T16:46:52.990 に答える
0
if you want to pass data to user (FindControl because added dynamicly)

    you must use this

    public partial class UserControl1 : System.Web.UI.UserControl
    {
        public string Property
        {
            get { return dd.SelectedValue; }
            set { dd.SelectedValue = value; }
        }
    }


    When you create, affect UniqueId to your user control

    UserControl1 control = new UserControl1();
    control.UniqueId="Test";  
    add.....

    And find it in your page  with PreInit event before other events 

    UserControl1 control = (UserControl1)Page.FindControl("Test");
    control.Property = your value;



But if you want to pass data to your user control, this last must have this property with public modifier.
You can also pass with static forms as this example

<tagprefix:tagname id="" runat="server" Property="your value"/>
于 2012-07-05T16:11:33.840 に答える