0

いくつかのチュートリアルとコード例に従おうとしましたが、期待どおりに動作しません。

Web ページに一連のテキスト ボックスがあり、それぞれをループしてその値をデータベースに保存する必要があります。ページ上のテキストボックスの数は異なります。データベースからロードします。それらはすべてテーブル オブジェクトに追加されます。

TableCell cellb = new TableCell();
TextBox txtAnswer = new TextBox();
txtAnswer.TextMode = TextBoxMode.MultiLine;
txtAnswer.Rows = 2;
txtAnswer.ID = "field_" + dataRow["fieldID"].ToString();
txtAnswer.Text = "answer"; //this will be got from the database

cellb.Controls.Add(txtAnswer);

これにより、テーブル行にテキストボックスが追加されます。次に、次のコードを持つ保存ボタンがあります

foreach (Control c in Page.Controls)
{
    foreach (Control childc in c.Controls) 
    {
        if (childc is TextBox)
        {
            TextBox tmpText = (TextBox)childc;
            tmpField = tmpText.ID.Split('_');
            fieldID = Convert.ToInt32(tmpField[1]);
            //save value to the database (eventually)
            debug.InnerHtml += tmpText.Text; //this just outputs the values for now
        }
    }
}

したがって、上記はすべてのページ コントロールをループし、page_load に追加されたテキスト フィールドを見つける必要があります。しかし、それが存在しないからなのか、今は疑問に思っています。そのため、ページを保存すると、コントロールがわかりません。テーブル コントロールは見えますが、中には何もありません。何かアイデアはありますか?!

4

3 に答える 3

1

ページ要求ごとに動的コントロールを追加する必要があります。できればInitイベント中。コントロールを反復処理するまでには、まだ (再び) 追加されていないようです。

また、TextBoxes が特定のコントロール内にあることがわかっている場合は、最初にそのコントロールを見つけてから、使用しているのと同じアプローチを使用して、コントロールを反復処理する必要があります。これには 2 つの理由があります: 効率性と、コード上では、ページ コントロールから 2 レベル下までしか検索していません。これは問題ないかもしれませんが、これらのテキスト ボックスを含まない他のコントロールが含まれています。

于 2012-12-17T13:39:57.590 に答える
0

Gridview コントロールを使用してから、Texbox でカスタム テンプレートを作成しないでください。次に、ページの読み込み時に、必要なテキストボックスを追加せず、グリッドビューをループしてデータを保存できます。

于 2012-12-17T13:39:18.420 に答える
0

初めにすること。if (!isPostBack){}ポストバックごとに再作成する必要があるため、 - 内にコントロールを作成していないことを確認してください。

第二に、実際には最初のレベルのみを通過するため、ループがすべてのコントロールを見つけるとは思いません。

理想的には、コントロールを再帰的に検索する必要があります。

これは、私が使用する再帰的な方法です。これは、特定の ID のすべてのコントロールを見つけるのに役立ちます。

    /// <summary> 
    /// Finds a Control recursively. Note finds the first match that exists 
    /// </summary> 
    /// <param name="ContainerCtl">Should be the lowest container in the heirarchy, for eg dont choose Master page if you can pick the specific panel</param> 
    /// <param name="IdToFind">ID of the control you are looking for</param> 
    /// <returns>the control if found else null</returns> 
    public static Control FindControlRecursive(Control Root, string Id)
    {
        if (Root.ID == Id) { return Root; }

        foreach (Control Ctl in Root.Controls)
        {
            Control FoundCtl = FindControlRecursive(Ctl, Id);
            if (FoundCtl != null) { return FoundCtl; }
        }
        return null;
    }

今、私がすることは次のとおりです。

を作成するときは、すべてのTextBoxを に格納します。次に、それらにアクセスする必要がある場合は、 をループして、エントリごとに上記のメソッドを呼び出します。これにより、必要な が返されます。IDArrayArrayTextBox

于 2012-12-17T14:41:37.957 に答える