1

動的に作成されたドロップダウン リストから値を取得する際に問題が発生しています。すべてのコントロールは Page_Init セクションで作成されます。リスト項目は、その時点でリスト項目の配列からも追加されます。(コントロールには同じ名前が付けられているため、適切な設定のためにビューステートにアクセスできる必要があります。)

値を取得しようとする関数は次のとおりです。

protected void Eng98AssignmentComplete_Click(object sender, EventArgs e)
{
    String myID = "0";
    Page page = Page;
    Control postbackControlInstance = null;
    // handle the Button control postbacks
    for (int i = 0; i < page.Request.Form.Keys.Count; i++)
    {
        postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
        //Response.Write(page.Request.Form.Keys[i].ToString());
        if (postbackControlInstance is System.Web.UI.WebControls.Button)
        {
            myID = Convert.ToString(
                postbackControlInstance.ID.Replace("button_", ""));
        }
    }
    String txtholder = "ctl00$ContentPlaceHolder$Eng098Instructors_" + myID;
    Response.Write("MYID: " + myID + "<br/>");
    DropDownList ddInstructorCheck = (DropDownList)Page.FindControl(txtholder);
    Response.Write("Instructor Selected: "
      + ddInstructorCheck.SelectedValue + "<br/>");
}

どのインストラクターが選ばれたかに関係なく、これが私が得た出力です.....

MYID: 1_1
Instructor Selected: 0
ctl00$ContentPlaceHolder$Eng098Instructors_1_1

コントロールの名前は正しいです(ソースを表示して確認)...

アイデア?

4

8 に答える 8

3

この派手な文字列を作成するには、多くの作業が必要です。

ctl00$ContentPlaceHolder$Eng098Instructors_1_1

これは、サーバー ID ではなく、コントロールのクライアント IDです。このコードはサーバー側で実行されるため、サーバー ID が必要です。サーバー ID を使用してそのコントロールを取得するには、次のようにする必要があります。

ContentPlaceHolder.FindControl("Eng08Instructors_1_1");

コンテンツ プレース ホルダーが新しい名前付けコンテナーを作成したため、ページを確認していないことに注意してください。

myIDまた、ループが変数を設定する方法は、常にKeys コレクションの最後のボタンを保持することになります。なぜループを気にするのですか?


あなたのコメントに基づいて、ドロップダウンリストの ID を見つけるより良い方法は次のようになります。

string id = ((Control)sender).ID.Replace("button_", "Eng098Instructors_");
于 2009-09-28T18:45:12.327 に答える
1

送信者をキャストしてみませんか?これは、ポストバックの原因となったボタンである必要があります。

string myId = "0";
Button btn = sender as Button;
if (btn != null)
    myId = btn.ID
...
于 2009-09-28T20:03:40.893 に答える
1

UniqueID プロパティが Request.Form のキーであるため、このようなことを実行する必要があります。

        List<Button> buttons = new List<Button>();
        List<DropDownList> dropdowns = new List<DropDownList>();
        foreach (Control c in Controls)
        {
            Button b = (c as Button);
            if (b != null)
            {
                buttons.Add(b);
            }

            DropDownList d = (c as DropDownList);
            if (d != null)
            {
                dropdowns.Add(d);
            }
        }

        foreach (String key in Request.Form.Keys)
        {
            foreach (Button b in buttons)
            {
                if (b.UniqueID == key)
                {
                    String id = b.ID.Replace("button_", "");
                    String unique_id = "ctl00$ContentPlaceHolder$Eng098Instructors_" + id;
                    Response.Write("MYID: " + id + "<br/>");

                    foreach (DropDownList d in dropdowns)
                    {
                        if (d.UniqueID == unique_id)
                        {
                            Response.Write("Instructor Selected: " + d.SelectedValue + "<br/>");
                            break;
                        }
                    } 
                }
            }   
        }
于 2009-09-28T20:17:34.060 に答える
1

クラスのインスタンスにコントロールを保存して、FindControl を使用する必要がないようにするにはどうすればよいでしょうか。

于 2009-09-28T18:36:51.757 に答える
1

ポストバック中にコントロールも再作成しますか? 動的に生成/追加されたコントロールは、リクエストごとに再作成する必要があります。自動的に再作成されるわけではありません。

于 2009-09-28T18:37:44.983 に答える
0

私は2つのキャッチを持っていました....これがそれらでした。

1.  I didn't clear the table I was adding to before re-creating the controls.

どうやら私の細部への注意は昨日はずれていたようです。コントロールを再作成した方法により、ポストバック時にコントロールの ctlXX フロントランナーが異なる番号であったと確信しています。

2.  I was assigning the same list to all the dropdownlist controls.  

ドロップダウン リスト コントロールを作成するたびにルックアップを呼び出すと、すべてがうまく機能します。

とにかくその価値のために....

于 2009-09-29T15:00:37.223 に答える
0

これはどう?

((Button)sender).Parent.FindControl(myid)

編集:あなたの質問を誤解しました。しかし、ページのライフサイクルに従うべきだと思います。動的に作成されたコントロールの一般的な問題です。

私はいくつかの調査を行いましたが、動的に作成されたコントロールに関する情報が役立つかもしれません...

于 2009-09-28T20:48:58.270 に答える
0

コードでコントロールを生成している理由はわかりませんが (そうする場合でも項目を動的に追加できます)、コントロールを生成するコードはおそらくここで大きな助けになるでしょう。リスト項目の値を設定しているのではなく、リスト項目のテキストを設定しているだけだと思います。SelectedText フィールドから得られるものを確認して、コントロール作成関数を投稿してください。

編集: @Martin の投稿に対するコメントに対して、「はい、ページが作成されるたびに Page_Init 関数でコントロールを再作成します (初期またはポストバック)」と答えました。それらを作成するときに、選択した値も設定していますか?

データがデータベースから取得された場合でも、ページ上でコントロールを使用できます。コントロール自体を動的に生成する必要はありません。

于 2009-09-28T18:35:57.960 に答える