C# 中继器页脚中的Find控件为文本框返回null

C# 中继器页脚中的Find控件为文本框返回null,c#,asp.net,repeater,findcontrol,nested-repeater,C#,Asp.net,Repeater,Findcontrol,Nested Repeater,我有两个嵌套的中继器。在嵌套的页脚中,我有文本框和文件上载控件。我能够毫无问题地获得文件上传的实例,但是文本框的实例为空,尽管两者都放在页脚中 以下是表示内部中继器页脚的aspx部分: <FooterTemplate> <tr class="add_comment"> <td>Add comment </td> </tr> <

我有两个嵌套的中继器。在嵌套的页脚中,我有文本框和文件上载控件。我能够毫无问题地获得文件上传的实例,但是文本框的实例为空,尽管两者都放在页脚中

以下是表示内部中继器页脚的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>
在运行页面时,我收到此错误

Object reference not set to an instance of an object 
这是由这条线引起的:

String postText = commentTextBox.Text.ToString(); 
我试图删除文本框代码,只检索上传文件,效果很好。问题在于访问文本框

编辑:应在同一页面中按钮的
onclick
事件处理程序中访问文本框的已访问文本和上载按钮的实例。因此,我全局定义了这两个函数,在执行中继器的一些嵌套中继器事件(如ItemDataBound)或由ItemCreated的Adrian Iftode建议的事件时为它们赋值。然后,在按钮的onclick中,我使用了它们,假设它们具有值,因为嵌套的repeater事件应该在按钮onclick之前触发。已成功检索上载文件实例,但文本框始终为空

全局变量声明:

  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有file时执行,postText始终被视为null

谁能帮我一下,是什么导致了这个错误


多谢各位

ItemDataBound不是这种情况下要处理的正确事件,因为没有为repeater项在中实例化页眉和页脚模板

将创建适当的事件

protected void rp_ItemCreated(Object sender, RepeaterItemEventArgs e)
{
            if (e.Item.ItemType == ListItemType.Footer)
            {    
              e.Item.FindControl(ctrl);
            }
            if (e.Item.ItemType == ListItemType.Header)
            {
              e.Item.FindControl(ctrl);
            }
}

演员阵容就是原因。将(文本框)(e.Item.FindControl(“comment_txt”);帮助?@Sami谢谢你,但我没有明白你的意思,我正在使用此转换来获取文本框的实例,然后检索其文本。请您详细说明演员阵容是如何造成问题的,以及如何解决问题的?谢谢。只是一个猜测,但是由于您得到了一个null引用,很可能强制转换失败,因此返回null。在您的原始代码中(我怀疑),编译器试图将“e”转换为文本框,但这是无法完成的。我添加了括号,以便e.Item.FindControl的结果将是编译器应该尝试强制转换的结果。@Sami,谢谢,我尝试了您的建议,但仍然得到相同的错误。请让我知道是否有任何其他可能的解决方案。谢谢,我尝试了这个,它只在本地范围内工作良好。当我全局定义字符串postText并从ItemCreated检索其值时,全局字符串值保持为null。我正在检查ButtonOnClick方法中的字符串值。你能告诉我为什么会这样吗?非常感谢。postText?这是什么?@Adrian Iftode,它是一个字符串,用于存储在文本框中输入的文本值。我想在点击“comment_btn”按钮时获取文本框中的文本。由于文本框位于嵌套的转发器中,因此我无法获取它的实例,除非在其中一个嵌套的转发器事件(如ItemCreated)中,同时可以从onclick内部访问此文本。因此,我全局定义了postText,并在repeater事件中为其分配了文本值。我认为必须在onclick之前执行repeater事件。你能帮帮我吗?是什么导致了这个错误?谢谢,我认为对你更好的是建立一个非常简单的例子,其中包括嵌套的中继器太,所以我可以采取更好的看。也可能有一个更简单的方法来做你想做的。非常感谢,我更新了问题,请检查它,让我知道我如何才能解决这个问题。非常感谢。
protected void rp_ItemCreated(Object sender, RepeaterItemEventArgs e)
{
            if (e.Item.ItemType == ListItemType.Footer)
            {    
              e.Item.FindControl(ctrl);
            }
            if (e.Item.ItemType == ListItemType.Header)
            {
              e.Item.FindControl(ctrl);
            }
}