4

「新しいプロファイルを作成する」ためのフォームがあります。私の問題は DropDownLists に関するものです。

最初の DropDown は、その値の関数で 2 番目の DropDown に動的に入力します。

この写真を参照してください:

http://image.noelshack.com/fichiers/2013/22/1369819471-picture-help.png

そして次の写真。

http://image.noelshack.com/fichiers/2013/22/1369830738-help2.png

2 番目の ddl ("Fonction") が正しく入力されていることがわかりますが、送信ボタンをクリックすると、値が null 値 ("Sélectionnez...") になり、RequiredFieldValidator によってページが無効になります!

1 番目の DropDownList の SelectedIndexChanged が原因でなくても、2 番目の DropDownList はすべてのポストバックで制限されているようです。1 番目の DropDownList の SelectedIndexChanged は常にポストバックで呼び出されるため、PostBack ごとに「populateDdl()」をスローします (値が選択されている場合)。

送信ボタンをクリックすると、データベースに空白の値が登録されます。

私は何が欠けていますか?

Aspx コード:

<asp:DropDownList ID="ddlTypePN" runat="server" DataSourceID="SqlTypePN" EnableViewState="true" 
        DataTextField="libelle" DataValueField="valeur" AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged" 
        OnDataBound="ddlTypePN_DataBound" > </asp:DropDownList> 

<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound" > </asp:DropDownList> 

コードビハインド:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ddlTypeProf.DataBind(); // don't care
        ddlSsoSrc.DataBind(); // don't care
        ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl
    }
}

protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e)
{
    string type = ddlTypePN.SelectedValue.ToString().Trim();
    // if PNT
    if (type.ToUpper().Trim().Equals("PNT"))
    {               
        ddlFctPN.Enabled = true;
        ddlTypeAv.Enabled = true;
        rfvTypeAv.Enabled = true;
        populateDdl();

    }
    else if (type.ToUpper().Trim().Equals("PNC"))
    {                
        ddlFctPN.Enabled = true;
        ddlTypeAv.Enabled = false;
        rfvTypeAv.Enabled = false;
        populateDdl();
    }     
}

void populateDdl()
{
    string val = "fct"+ddlTypePN.SelectedValue.ToString().Trim(); // Used for SELECT
    SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["My_DB"].ConnectionString);
    ddlFctPN.Items.Clear();
    DataTable subjects = new DataTable();
    try
    {
        SqlDataAdapter adapter = new SqlDataAdapter("My SELECT", sqlConn);
        adapter.Fill(subjects);

        ddlFctPN.DataSource = subjects;
        ddlFctPN.DataTextField = "libelle";
        ddlFctPN.DataValueField = "valeur";
        ddlFctPN.DataBind();
    }
    catch (Exception ex)
    {
        lblErr.Text = ex.Message;
    }
    ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));
}
4

9 に答える 9

2
if(!IsPostBack)

 {

  populateDdl();

 }
于 2013-05-29T10:16:37.827 に答える
1

このコードをこの条件の下に置きます

if(!Page.IsPostBack)
            {

       // Your Code Here

            }
于 2013-05-29T10:14:39.730 に答える
1

マークアップから、2 番目のドロップダウンで AutoPostBack プロパティを設定していません。そのため、2 番目のドロップ ダウン インデックスが変更されたときにポスト バックを起動するべきではありません (プログラムでポスト バックを引き起こしている場合を除く)。

あなたのコードを私のソリューションにコピーしました。動作しているようです...

<asp:Label ID="lblErr" runat="server"></asp:Label>
<asp:DropDownList ID="ddlTypePN" runat="server" EnableViewState="true"
    AutoPostBack="true" OnSelectedIndexChanged="ddlTypePN_SelectedIndexChanged"
    OnDataBound="ddlTypePN_DataBound">
</asp:DropDownList>

<asp:DropDownList runat="server" ID="ddlFctPN" AppendDataBoundItems="false" OnDataBound="ddlFctPN_DataBound">
</asp:DropDownList>

そしてコード...

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ListItemCollection items = new ListItemCollection();
                items.Add(new ListItem("PNT", "PNT"));
                items.Add(new ListItem("PNC", "PNC"));

                ddlTypePN.DataSource = items;
                ddlFctPN.DataBind();
                ddlTypePN.DataBind(); // The ddl that populate my 2nd ddl

                ddlTypePN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));
            }
        }

        protected void ddlTypePN_SelectedIndexChanged(object sender, EventArgs e)
        {
            string type = ddlTypePN.SelectedValue.ToString().Trim();

            // if PNT
            if (type.ToUpper().Trim().Equals("PNT"))
            {
                ddlFctPN.Enabled = true;
                populateDdl();

            }
            else if (type.ToUpper().Trim().Equals("PNC"))
            {
                ddlFctPN.Enabled = true;
                populateDdl();
            }        
        }

        protected void ddlTypePN_DataBound(object sender, EventArgs e)
        {

        }

        protected void ddlFctPN_DataBound(object sender, EventArgs e)
        {

        }

        void populateDdl()
        {

            ddlFctPN.Items.Clear();
            lblErr.Visible = false;

            try
            {
                ListItemCollection items = new ListItemCollection();
                items.Add(new ListItem("One", "1"));
                items.Add(new ListItem("Two", "2"));
                items.Add(new ListItem("Three", "3"));

                ddlFctPN.DataSource = items;
                ddlFctPN.DataBind();
            }
            catch (Exception ex)
            {
                lblErr.Text = ex.Message;
                lblErr.Visible = true;
            }


            ddlFctPN.Items.Insert(0, new ListItem("Sélectionnez...", "null"));

        }

    }
于 2013-05-29T10:51:39.963 に答える
-1

同様の問題とドロップダウンが変更されない理由を何時間も理解しようとした後、データを確認しました. データをチェックして、値が異なるかどうかを確認します。

于 2014-04-03T14:21:42.957 に答える