0

FormViewがあり、その中にあるDivやその他のコントロールにアクセスする必要があります。私のapsxコードは次のようになります。

 <asp:FormView ID="Edit_FV" runat="server" DataKeyNames="IDproceso" DefaultMode="Edit" DataSourceID="SqlDS_Procesos">
            <EditItemTemplate>
                <div id="second_info" runat="server">
                    <div id="second_info_left" runat="server">
                        <div id="alcance" class="report_field" runat="server">
                            <p class="container-title">
                                Alcance:</p>
                            <asp:TextBox ID="TextBox14" runat="server" TextMode="multiline" Width="400px" Height="120px" Text='<%# Bind("alcance") %>' />
                        </div> 
                    </div>
                    <div id="second_info_right" runat="server">
                    <div class="valores-container" id="tipo_ahorro" runat="server">
                        <asp:CheckBox ID="ahorro_state" runat="server" Checked='<%# Bind("tipo_ahorro") %>'  />
                    </div>
                </div>
            </EditItemTemplate>
        </asp:FormView>

ここで、withにアクセスしたい場合は、CheckBoxwithid = ahorro_stateを試してEdit_FV.FindControl("ahorro_state")、Null参照を取得しました。Edit_FV.FindControl("MainContent_Edit_FV_ahorro_state")これが最終的なHTMLドキュメントで実際にIDに名前が付けられる方法であるため、私も試してみましたが、Null参照も取得しました。second_infoいずれかのdiv(ID 、など)にアクセスしようとしたときにも同じことが起こりtipo_ahorroました。ばかげた間違いをしているように感じますが、少し周りを見回して、見つけて答えることができませんでした。

これを解決する方法はありますか?

編集:FindControlを呼び出しているコードを追加しました。

Page_Load()からDataBind()を呼び出してみました。

protected void Page_Load(object sender, EventArgs e)
        {

            DataBind();
            if (Edit_FV.CurrentMode == FormViewMode.Edit)
            {
                Control c = Edit_FV.FindControl("ahorro_state");//c is null here.
            }
        }

また、Edit_FVのOnDataBound属性を設定してみました。OnDataBound="onBound"

   protected void onBound(object sender, EventArgs e)
            {
                if (Edit_FV.CurrentMode == FormViewMode.Edit)
                {
                    ControlCollection a = Edit_FV.Controls;
                    Control c = Edit_FV.FindControl("ahorro_state");//c is null here
                }

            }
4

2 に答える 2

1

デフォルトのモードは「編集」に設定されていますが、コントロールがDataBoundになるまで、フォームビューはそのモードに切り替わりません。最初に呼び出しDataBind()てから、要素のIDを使用してFindControlを使用してください(2番目の例で試したClientIDではありません)。

FindControlロジックを配置する場所の例については、FormView.FindControl():オブジェクト参照エラーを参照してください。

編集:

データソースがデータを返さない可能性もあります。これにより、EditItemTemplateが空になり、null参照エラーを説明する可能性があります。Edit_FV.DataItemCount > 0編集モードに切り替える前に、を確認してみてください。

于 2012-08-08T16:53:29.877 に答える
1

'FindControl'でも同様の問題が発生しました。
a)コントロールを再帰的に検索し、b
)デバッグステートメントは、問題のコントロールが見つからない理由を確認するのに非常に役立ちました。
コントロールを見つけるのに役立つように、デフォルトでID値がない場合は、探しているときにID値を指定する必要があります。

    public static class General_ControlExtensions
{
    //From: http://www.devtoolshed.com/content/find-control-templatefield-programmatically
    /// <summary>
    /// recursively finds a child control of the specified parent.
    /// USAGE: 
    /// Control controlToFind = DetailsView1.fn_ReturnControl_givenControlID("txtName");
    /// </summary>
    /// <param name="rootControl"></param>
    /// <param name="ID"></param>
    /// <returns></returns>
    public static Control fn_ReturnControl_givenControlID(this Control rootControl, string ID)
    {
        if (rootControl.ID == ID)
        {
            return rootControl;
        }
        foreach (Control control in rootControl.Controls)
        {

            Debug.WriteLine("FindByID - child.id: " + control.ID);
            Control foundControl = fn_ReturnControl_givenControlID(control, ID);
            if (foundControl != null)
            {
                return foundControl;
            }
        }
        return null;
    }

その使用例を次に示します。

using System.Diagnostics;   // for debug 

TextBox txt_LastName = (TextBox)fv_NewHire_DetailsForm.fn_ReturnControl_givenControlID("INSERT_txt_LastName");

さらに、このタイプの問題では、「insertitemtemplate」のコントロールの前に「INSERT_」を付け、「edititemtemplate」のコントロールの前に「EDIT_」を付けて、デバッグ出力ですばやく区別できると便利です。

于 2014-07-08T17:53:49.423 に答える