c# - 在转发器页脚中查找控件为文本框返回 null

标签 c# asp.net repeater findcontrol nested-repeater

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

这是代表内部转发器页脚的 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 事件处理程序中访问。因此,我已经全局定义了两者,并在执行 Repeater 的某些嵌套转发器事件(如 ItemDataBound 或 Adrian Iftode 建议的 ItemCreated 事件时为它们分配了值。然后,在按钮的 onclick 中,我使用它们假设它们具有值,因为嵌套的转发器事件应该在按钮的 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 有文件时才会执行,postText 总是被视为 null。

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

谢谢。

最佳答案

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

正确的事件是 ItemCreated

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);
            }
}

关于c# - 在转发器页脚中查找控件为文本框返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34163670/

相关文章:

c# - 使用内存高效方法在数组中查找重复项

c# - 如何检查一个类是否属于某种类型,忽略继承?

c# - 无法使用 WebResponse c# 访问此页面

javascript - 如何在中继器中定位并单击 ng-click 按钮

c# - 将 NULL 传递给构造函数

c# - SQL Server 验证返回错误的输出

c# - 网络服务响应时间增加了……怎么办?

c# - 我可以在 asp :repeater? 中使用过滤器吗

c# - 在 Repeater 中填充 DropDownList 不起作用

c# - 如何打印数组的所有内容