0

VS 2010、C#、.NET3.5の使用

3つのユーザー定義のWebコントロールがあります。

コントロール1にはリストボックスとボタンがあります

コントロール2には3Text-Boxesつの2DropDownListsと3がありますButtons

コントロール3には、コードに入力されたテーブルのみがあります。

私は2つのページを持っています:

ページ1にはコントロール2とコントロール3があります

ページ2には、コントロール1、コントロール2、およびコントロール3があります。

コントロール2の機能はページ1で完全に機能します。

ただし、2ページ目に送信ボタンがクリックされると、DropDownListsの両方が常に表示SelectedIndex = 0されSelectedValue = "0"ます。

コントロール2の[送信]ボタンをクリックすると、3つのテキストボックスとボタンすべてが両方のページでその値を保持します。DropDownListsのみがその値を保持できません。

参考までに、SubmitButtonOnClickイベントのコードは次のとおりです。

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        clsLog.WriteLog("TrainingForm.ascx - Submit.");
        tcCategoryError.Text = " ";
        tcDateError.Text = " ";
        tcDescriptionError.Text = " ";
        tcHoursError.Text = " ";
        tcMethodError.Text = " ";
        foreach (Control c in this.Controls)
        {
            LogControls(c);
        }
        c_iTID = Convert.ToInt32(hTID.Value);
        c_szUserName = hUserName.Value;
        bool bValid = true;
        DateTime dtTrainingDate = DateTime.MinValue;
        string szTrainingDescription = "";
        decimal dHours = 0M;
        int iCategoryID = 0;
        int iMethodID = 0;
        if (!DateTime.TryParse(txtTrainingDate.Text, out dtTrainingDate))
        {
            bValid = false;
            tcDateError.Text = "Please Enter Valid Training Date";
        }
        if (!decimal.TryParse(txtTrainingHours.Text, out dHours))
        {
            bValid = false;
            tcHoursError.Text = "Please Enter Valid Training Hours";
        }
        if (this.ddlCategory.SelectedValue == "0")
        {
            bValid = false;
            tcCategoryError.Text = "Please Select Training Category";

        }
        else
            iCategoryID = Convert.ToInt32(this.ddlCategory.SelectedValue);
        if (this.ddlTrainingMethod.SelectedValue == "0")
        {
            bValid = false;
            tcMethodError.Text = "Please Select Training Method";
        }
        else 
            iMethodID = Convert.ToInt32(this.ddlTrainingMethod.SelectedValue);
        if (txtTrainingDescription.Text.Trim() == "")
        {
            bValid = false;
            tcDescriptionError.Text = "Please Enter Training description.";
        }
        else
            szTrainingDescription = txtTrainingDescription.Text.Trim();
        if (bValid)
        {
            clsData.UpdateTraining(c_iTID, "", c_szUserName, dtTrainingDate, szTrainingDescription, iCategoryID, dHours, iMethodID);
            TrainingID = 0;
            ClearForm();
        }
        OnEvent(new MyEventArgs(c_szUserName));

    }

ドロップダウンを設定するコード(ユーザー定義コントロールの一部)

    protected void BindddlCategory(int iCategoryID)
    {
        DataTable dt = clsData.GetTrainingCategories();
        ddlCategory.Items.Clear();
        ddlCategory.AppendDataBoundItems = true;
        ddlCategory.Items.Add(new ListItem("Select Training Category", "0"));
        ddlCategory.DataSource = dt;
        ddlCategory.DataTextField = "TrainingCategory";
        ddlCategory.DataValueField = "CID";
        ddlCategory.DataBind();
        if (iCategoryID != 0)
            ddlCategory.SelectedValue = iCategoryID.ToString();
    }
    protected void BindddlCategory()
    {
        BindddlCategory(0);
    }
    protected void BindddlTrainingMethod(int iMethodID)
    {
        DataTable dt = clsData.GetTrainingMethods();
        ddlTrainingMethod.Items.Clear();
        ddlTrainingMethod.AppendDataBoundItems = true;
        ddlTrainingMethod.Items.Add(new ListItem("Select Training Method", "0"));
        ddlTrainingMethod.DataSource = dt;
        ddlTrainingMethod.DataTextField = "TrainingCategory";
        ddlTrainingMethod.DataValueField = "CID";
        ddlTrainingMethod.DataBind();
        if (iMethodID != 0)
            ddlTrainingMethod.SelectedValue = iMethodID.ToString();
    }
    protected void BindddlTrainingMethod()
    {
        BindddlTrainingMethod(0);
    }

参考までに、DDLはページの読み込み時に入力されませんが、コントロールの形式を示すイベントが発生したときに暗黙的に入力されます。

    public void ShowTrainingEntry(int iTrainingID)
    {
        clsLog.WriteLog("TrainingForm.ascx - ShowTrainingEntry(" + iTrainingID.ToString() + ")");
        hTID.Value = iTrainingID.ToString();
        hUserName.Value = UserName;
        int iCategoryID = 0;
        int iMethodID = 0;
        if (iTrainingID != 0)
        {
            DataTable dt = clsData.GetTrainingRecord(iTrainingID);
            if (dt.Rows.Count == 1)
            {
                txtTrainingDate.Text = Convert.ToDateTime(dt.Rows[0]["TrainingDate"]).ToString("MM/dd/yyyy");
                txtTrainingHours.Text = Convert.ToDecimal(dt.Rows[0]["Hours"]).ToString("N1");
                txtTrainingDescription.Text = dt.Rows[0]["TrainingDescription"].ToString();
                int.TryParse(dt.Rows[0]["CategoryCID"].ToString(), out iCategoryID);
                int.TryParse(dt.Rows[0]["MethodCID"].ToString(), out iMethodID);
            }
            ShowChangeMessage(iCategoryID == 0 | iMethodID == 0);
            ShowDeleteButton(true);
            ShowCancelButton(true);
        }
        BindddlCategory(iCategoryID);
        BindddlTrainingMethod(iMethodID);
        tblMain.Visible = true;
    }

なぜこれが起こっているのかについて誰かが何か考えを持っていますか?

ありがとう、ジョン

4

1 に答える 1

0

UserControlsを動的に追加する場合は、 Page_Initまでに追加されるようにする必要があります。これは、ページがPostBackから値を設定しようとしたときにコントロールが存在するようにするためです。

于 2012-11-08T18:28:26.213 に答える