ネストされたリピーターが 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 と見なされる場合にのみ実行されます。
このエラーの原因は何ですか?
ありがとうございました。