4

ネストされたリピーターが 2 つあります。ネストされたフッターには、テキスト ボックスとファイル アップロード コントロールがあります。ファイル アップロードのインスタンスは問題なく取得できましたが、テキスト ボックスのインスタンスは null ですが、どちらもフッターに配置されています。

内部リピーターのフッターを表す aspx パーツは次のとおりです。

<FooterTemplate>
            <tr class="add_comment">
                <td>Add comment </td>

            </tr>
            <tr>
                <td>
                    <asp:TextBox runat="server" Columns="20" Rows="3" ID="comment_txt" TextMode="MultiLine" Width="60%" CssClass="new_comment" ViewStateMode="Inherit"></asp:TextBox>

                </td>

             </tr>

           <tr class="add_comment">
                <td>
                            <asp:FileUpload ID="uploadImageBtn" runat="server" Text="Add image" OnClick="uploadImage" CssClass="comment_buttons" />

                            <asp:Button ID="comment_btn" runat="server" OnClick="submitComment" Text="Comment" CssClass="comment_buttons" />
                </td>
       </tr>

         </table>
     </FooterTemplate>

これは、コントロールにアクセスしようとしている C# コードです。

protected void commentsRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if ((e.Item.ItemType == ListItemType.Footer ))
            {
                Repeater childRepeater = (Repeater)sender;
                TextBox commentTextBox = (TextBox)e.Item.FindControl("comment_txt");
                String postText = commentTextBox.Text.ToString(); 
                FileUpload upFile = (FileUpload)e.Item.FindControl("uploadImageBtn");
            }
        }

ページを実行すると、このエラーが発生します。

Object reference not set to an instance of an object 

これは、次の行によって引き起こされます。

String postText = commentTextBox.Text.ToString(); 

テキスト ボックスのコードを削除して、アップロード ファイルのみを取得しようとしたところ、非常にうまく機能しました。問題は、テキスト ボックスへのアクセスにあります。

編集:テキスト ボックスのアクセスされたテキストとアップロード ボタンのインスタンスはonclick、同じページ内のボタンのイベント ハンドラーでアクセスする必要があります。したがって、両方をグローバルに定義し、ItemDataBound などの Repeater のネストされたリピーター イベントまたはAdrian Iftodeによって提案された ItemCreated であるイベントを実行しながら値を割り当てました。次に、ボタンのonclickで、ネストされたリピーターイベントがボタンのonclickの前に発生する必要があるため、値があると仮定してそれらを使用しました。アップロード ファイル インスタンスは正常に取得されますが、テキスト ボックスは常に null です。

グローバル変数宣言:

  TextBox commentTextBox;
    FileUpload upFile;
    Repeater childRepeater;
    String postText; 

ネストされたリピーター イベント内のコード:

 protected void commentsRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            if ((e.Item.ItemType == ListItemType.Footer))
            {
                 childRepeater = (Repeater)sender;
                 commentTextBox = (TextBox)(e.Item.FindControl("comment_txt"));
                 postText = commentTextBox.Text.ToString();
                upFile = (FileUpload)e.Item.FindControl("uploadImageBtn");
            }
        }

onclick 内のコード:

protected void submitComment(object sender, EventArgs e)
        {


            Boolean insert = true;
            if (upFile.HasFile || !String.IsNullOrEmpty(postText))
            {
                   //some code. 
              }

上記の if ステートメントは、upFile にファイルがあり、postText が常に null と見なされる場合にのみ実行されます。

このエラーの原因は何ですか?

ありがとうございました。

4

1 に答える 1