检查ASP Repeater控件中的空数据库值

时间:2009-09-02 00:14:17

标签: asp.net database repeater

在本周之前,我从来没有在我的生活中写过一篇关于ASP.NET的文章,所以请对我这么轻松。

我有一个ASP.NET页面,可以显示数据库中的图片。我创建了一个SqlDataReader并将转发器绑定到此读取器。该页面显示一个包含三列的表格:图片的缩略图(数据库中的路径),拍摄照片的相机名称(来自数据库)以及有关图片的评论。

当我将照片上传到数据库时,注释将为null。我希望表显示注释(如果存在),或者注释字段在数据库中为空,显示ASP文本框和按钮,供用户输入关于图片的注释。

事实证明这并不像我想象的那么容易。任何人都可以向我建议:

A)用于确定此行的“comment”列是否为空的显式测试

B)如何有条件地显示文本或文本框/按钮组合(具有来自数据库“ID”列的id的texbox)

我相信我有能力编写按钮点击处理程序以使用注释更新数据库...如果我可以显示它。

非常感谢,我承诺将来拒绝ASP.NET项目!

2 个答案:

答案 0 :(得分:2)

由于您处于数据绑定上下文中,因此可以对占位符(或任何其他控件)的可见属性使用数据绑定表达式。

<asp:PlaceHolder runat="server" visible='<%# Convert.IsDbNull( Eval("comment") )%>'>
  <asp:TextBox ID="txtNewComment"... />
  <asp:Button ... />
</asp:PlaceHolder>

对于非null,只需拍打“转换”前面的一个惊叹点,并显示它何时不为空。

对于点击处理程序,由于“发件人”将成为按钮,因此您可以随时进行简单的

((Button)sender).Parent.FindControl("txtNewComment")

你有文本框。

答案 1 :(得分:0)

如果注释字段在数据库中包含NULL值,则可以使用Alex的建议来显示注释或文本框/按钮组合。我认为你需要绑定到'OnItemCommand'来处理转发器中的按钮点击。

这是一个例子。

<asp:Repeater ID="myRepeater" runat="server" OnItemCommand="myRepeater_ItemCommand">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>          
        <tr>
            <td>
                <asp:Image ID="imgThumbNail" runat="server" ImageUrl='<%# Eval("path") %>' />
            </td>
            <td>
                <asp:Label ID="lblCamera" runat="server" Text='<%# Eval("camera") %>'></asp:Label>
            </td>
            <td>
                <asp:PlaceHolder ID="PlaceHolder1" runat="server" Visible='<%# Convert.IsDBNull( Eval("comment") )%>'>
                    <asp:Button ID="btnAddComment" runat="server" CommandArgument='<%# Eval("id") %>' CommandName="AddComment" Text="Add Comment" />
                    <asp:TextBox ID="txtComment" runat="server" </asp:TextBox>                      
                </asp:PlaceHolder>              
                <asp:PlaceHolder ID="PlaceHolder2" runat="server" Visible='<%# !Convert.IsDBNull(Eval("comment"))%>'>
                    <asp:Label ID="lblComment" runat="server" Text='<%# Eval("comment") %>'></asp:Label>
                </asp:PlaceHolder>
            </td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

protected void myRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if (e.CommandName == "AddComment")
    {
        TextBox txtComment = (TextBox)e.Item.FindControl("txtComment");
        int id = Convert.ToInt32(e.CommandArgument);
        // use the record id to update the comment in the database with the value contained in the txtComment.Text property here
    }
}