在我的gridview www.example.com中设置某些行的样式asp.net

aydmsdu9  于 2022-11-26  发布在  .NET
关注(0)|答案(2)|浏览(249)

所以我有一个gridview显示一个数据库表我有.我没有创建表手动显然这是什么〈%#Eval(“text”)%〉'和Bind()做.我创建了一个独特的表与我的sql查询添加两行总和在表的底部,(2最后记录),我的问题是:有没有一种方法可以让我访问这些行来设置它们的样式?我认为这是不可能的,但我仍然在问,也许我会找到一种方法。谢谢

aurhwmvo

aurhwmvo1#

是的,需要对单个单元格(自动生成的列或绑定列)设置样式,甚至需要对整行设置样式。
让我们完成所有3项
首先,设置“单元格”的样式(这些单元格位于单元格集合、自动生成的列和非模板化列中)。
假设这个简单的网格

<asp:GridView ID="GridView1" runat="server"  Width="40%" 
    AutoGenerateColumns="False" DataKeyNames="ID"  CssClass="table table-hover">
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="City" HeaderText="City" />
        <asp:TemplateField HeaderText="Description">
            <ItemTemplate>
                <asp:Label ID="lblDescript" runat="server"
                    Text='<%# Eval("Description")  %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Active" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:CheckBox ID="chkActive" runat="server"
                    Checked='<%# Eval("Active") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

(note我是如何包含两个模板化的列,它们都有普通的jane asp.net控件,如标签、文本框等,或者内置的GV列(数据绑定的列,或者自动生成的列)
加载GV的代码如下:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadData()
    End If

End Sub

Sub LoadData()

    Dim strSQL = "SELECT * FROM tblHotelsA ORDER BY HotelName"
    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL As New SqlCommand(strSQL, conn)
            conn.Open()
            Dim rst As New DataTable
            rst.Load(cmdSQL.ExecuteReader)
            GridView1.DataSource = rst
            GridView1.DataBind()
        End Using
    End Using

End Sub

我们现在有了这个:

好了,让我们来做例子1 --给上面的“city”列着色。注意“city”是如何成为一个“绑定字段”的。
因此,自动生成或绑定的字段=单元格集合。
那么,对于像条件格式这样的事情,甚至合并一些列,改变颜色,隐藏显示图像,或者其他什么?
使用GV行数据绑定事件。(这适用于列表视图、重复器等。)
因此,对于city =埃德蒙顿,我们需要一个浅蓝色单元格,而对于city =“Edmonton”,我们需要一些绿色。
因此,我们使用行绑定事件。
此代码:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then

        Select Case e.Row.Cells(3).Text
            Case "Edmonton"
                e.Row.Cells(3).BackColor = System.Drawing.Color.SkyBlue
            Case "Banff"
                e.Row.Cells(3).BackColor = System.Drawing.Color.LightGreen
        End Select

    End If

End Sub

我们现在有了这个:

不过,上面对于“模板化”栏目的工作方式有点不同。
假设我们想要在check box = true(选中)时突出显示描述。
在这种情况下,我们不能(不)使用cells集合,但是对于模板化控件,我们使用find控件。
就像这样:

Dim cActive As CheckBox = e.Row.FindControl("chkActive")
        If cActive.Checked Then
            Dim lblDes As Label = e.Row.FindControl("lblDescript")
            lblDes.Font.Italic = True
            e.Row.Cells(4).BackColor = System.Drawing.Color.LightGray
        End If

注意我们如何在标签控件中将字体设置为斜体。
现在我们看到这个:

注非常接近我们如何使用findcontrol来获得这些模板化控件。
最后但并非最不重要的一点是:
让我们突出显示整行的active,甚至不要让GV中有复选框列(但它在数据库源中)。
因此,假设列的标记如下:

<Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="City" HeaderText="City" />
        <asp:TemplateField HeaderText="Description">
            <ItemTemplate>
                <asp:Label ID="lblDescript" runat="server" 
                    Text='<%# Eval("Description")  %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>

因此,“active”复选框甚至不会显示在GV中(但是,它位于为GV提供数据的数据源中)。
所以,我们可以这样做:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow Then

        Dim gData As DataRowView = e.Row.DataItem   ' Grid data - NOT the GV row!!!!!!

        If gData.Item("Active") = True Then

            e.Row.Style.Add("Background-color", "LightGray") ' highlight whole row.

        End If

    End If

End Sub

我们现在得到这个:

请记住,“数据项”(整个数据库行)仅在行数据绑定期间可用,一旦数据绑定完成,它将/确实超出范围。

mrfwxfqh

mrfwxfqh2#

因此基本上使用了与albert的回复非常相似的逻辑,我最终手动捕获了最后两行并更改了它们的颜色。

protected void grdReports_PreRender(object sender, EventArgs e)
    {
        //finding 2 last rows, changing backcolor to the sum specified color '#5D7B9D' and the forecolor to white

        //first table ( annual ) 
        GridViewRow lastRow = grdReports.Rows[grdReports.Rows.Count - 1];
        lastRow.BackColor = System.Drawing.Color.FromName("#5D7B9D");
        lastRow.ForeColor = Color.White;
        GridViewRow secondToLastRow = grdReports.Rows[grdReports.Rows.Count - 2];          
        secondToLastRow.BackColor = System.Drawing.Color.FromName("#5D7B9D");
        secondToLastRow.ForeColor = Color.White;

        //second table ( requested )
        GridViewRow lastRowSecond = grdReports2.Rows[grdReports2.Rows.Count - 1];
        lastRowSecond.BackColor = System.Drawing.Color.FromName("#5D7B9D");
        lastRowSecond.ForeColor = Color.White;
        GridViewRow secondToLastRowSecond = grdReports2.Rows[grdReports2.Rows.Count - 2];
        secondToLastRowSecond.BackColor = System.Drawing.Color.FromName("#5D7B9D");
        secondToLastRowSecond.ForeColor = Color.White;
    }

相关问题