根据行值更改整行的颜色
Posted
技术标签:
【中文标题】根据行值更改整行的颜色【英文标题】:Change color of entire row based on row value 【发布时间】:2022-01-12 20:12:10 【问题描述】:如果对象已签出/签入,则尝试使整个 Row 变为红色。这是我当前的代码,我知道这可能很简单,但我是菜鸟。
<ItemTemplate>
<tr id="trId" runat="server">
<td style="text-align: left;">
<%#Eval("Name")%>
</td>
<td style="text-align: left;">
<asp:Label ID="lblDescription" runat="server" Text='<%#Eval("Description")%>'></asp:Label>
</td>
<td style="text-align: left; display: none;">
<asp:CheckBox ID="chkStatus" runat="server" Checked='<%#Eval("CheckedOut")%>' />
</td>
<td style="text-align: left;">
<asp:Label ID="lblStatus" runat="server" Text='<%#Eval("Status")%>'></asp:Label>
</td>
<td style="text-align: left;">
<asp:Label ID="lblLocation" runat="server" Text='<%#Eval("Location")%>'></asp:Label>
</td>
<td style="text-align: left;">
<asp:Button ID="btnChangeStatus" Postback="false" runat="server" Width="150"
CommandArgument='<%#Eval("CatId") & "^" & Eval("CheckedOut")%>' OnClick="ChangeStatus" CssClass="btn btn-default" Font-Bold="True" />
</td>
<td style="text-align: left;">
<asp:Button ID="btnEdit" PostBack="false" runat="server" Text="Edit" CssClass="btn btn-default" Width="150"
CommandArgument='<%#Eval("CatId")%>' OnClick="Edit" />
</td>
</tr>
</ItemTemplate>
Protected Sub CheckPermissions(sender As Object, e As RepeaterItemEventArgs) Handles rep_Data.ItemDataBound
If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
Dim chkStatus As CheckBox = CType(e.Item.FindControl("chkStatus"), CheckBox)
Dim btnChangeStatus As Button = CType(e.Item.FindControl("btnChangeStatus"), Button)
Dim lblStatus As Label = CType(e.Item.FindControl("lblStatus"), Label)
If chkStatus.Checked = False Then
btnChangeStatus.Text = "Check Out"
Else
btnChangeStatus.Text = "Check In"
lblStatus.ForeColor = Drawing.Color.Red
End If
【问题讨论】:
目前只是将 lblStatus 字段中的文本变为红色。 不太懂asp,但是这个有用吗?Dim row = DirectCast(e.Item.FindControl("trId"), TableRow)
row.BackColor = Drawing.Color.Red
【参考方案1】:
好的,如果您注意到这是 GridView 还是 ListView,那就太好了。
但是,查看标记 - 看起来像 ListView - 而且它们是一个很好的控件 - 我最喜欢。虽然 GridView 通常标记较少,但当您真的想要布局更复杂的网格时,ListView 开始胜出(总的来说,整体标记通常更少 - 并且存在更多格式/样式选项。
作为一般规则,给定列的行格式(甚至单个控件)最合适的选择是什么?使用行数据绑定事件。
您也没有分享您拥有的示例代码在何处/何时/如何运行?
但是,我们暂时假设您要为该列表视图提供一些数据。
您也确实有两个按钮 - 但您为按钮设置了 postback = false ? (为什么??)。事实上,无论如何按钮都没有 PostBack="False" 。所以,删除它。
我们可以稍微连接按钮 - 但第一步是获取我们的条件格式,并且“签入”和“签出”的“文本”首先适用于现有数据。然后,我们就可以处理两次按钮点击了。
所以,我们使用行数据绑定事件。这有几个原因,但是在那个“事件”期间,您不仅可以获得整个列表视图行,而且还可以在行绑定事件期间获得不在列表视图中的列!!!。所以我可能想强调一些值,或者甚至不在 ListView 显示中的标志 - 但它是数据源的一部分。这意味着您通常不必包含一些隐藏的列值 - 因此请牢记这些重要提示。
所以,假设我们有这个列表视图:
<div style="width:50%">
<asp:ListView ID="ListView1" runat="server" DataKeyNames="ID">
<ItemTemplate>
<tr style="">
<td>
<asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' />
</td>
<td>
<asp:Label ID="LastNameLabel" runat="server" Text='<%# Eval("LastName") %>' />
</td>
<td>
<asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' />
</td>
<td>
<asp:Label ID="Desciption" runat="server" Text='<%# Eval("Description") %>' />
</td>
<td>
<asp:CheckBox ID="ActiveCheckBox" runat="server" Checked='<%# Eval("Active") %>' />
</td>
<td>
<asp:label ID="ActiveText" runat="server" />
</td>
</tr>
</ItemTemplate>
<LayoutTemplate>
<table id="itemPlaceholderContainer" runat="server" border="0" class="table">
<tr runat="server" style="">
<th runat="server">FirstName</th>
<th runat="server">LastName</th>
<th runat="server">City</th>
<th runat="server">Descripiton</th>
<th runat="server">Active</th>
<th runat="server">Active Text</th>
</tr>
<tr id="itemPlaceholder" runat="server">
</tr>
</table>
</LayoutTemplate>
</asp:ListView>
</div>
没有太多的标记。然后我们可以用以下代码填充 LV:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid()
End If
End Sub
Sub LoadGrid()
Using conn As New SqlConnection(My.Settings.TEST4)
Dim strSQL As String = "SELECT TOP 10 * from tblHotels WHERE Description is not null ORDER BY HotelName"
Using cmdSQL = New SqlCommand(strSQL, conn)
conn.Open()
Dim rstData = New DataTable()
rstData.Load(cmdSQL.ExecuteReader)
ListView1.DataSource = rstData
ListView1.DataBind()
End Using
End Using
End Sub
我们的输出现在是这样的:
现在,让我们格式化上面所说的非活动行是红色背景。
我们还将设置活动文本
(if active = true), then You can book!
(if active = false), the text = "don't use"
因此,如前所述,我们使用行数据绑定事件。
但是我们需要像这样在行标记中添加一个“id”:
<ItemTemplate>
<tr id="onerow" runat="server">
<td>
<asp:Label ID="FirstNameLabel" runat="server" Text='<%# Eval("FirstName") %>' />
</td>
所以,我们称它为一行。
现在,在我们的数据项绑定事件中,我们有以下代码:
Protected Sub ListView1_ItemDataBound(sender As Object, e As ListViewItemEventArgs) Handles ListView1.ItemDataBound
If e.Item.ItemType = ListViewItemType.DataItem Then
Dim ckBox As CheckBox = e.Item.FindControl("ActiveCheckBox")
Dim txtActive As Label = e.Item.FindControl("ActiveText")
Dim onerow As htmlTableRow = e.Item.FindControl("onerow")
If ckBox.Checked = False Then
txtActive.Text = "Dont use"
' set whole row to red (light red
onerow.BgColor = "LightCoral"
Else
txtActive.Text = "Use Me"
' set whole row to red (light red
onerow.BgColor = "Lightskyblue"
End If
End If
End Sub
现在我们有了这个:
现在下一部分是这两个按钮单击事件。我们可以并且想要为这两个按钮编写一些代码。
所以这是第一个:
<td style="text-align: left;">
<asp:Button ID="btnChangeStatus" runat="server" Width="150"
CommandArgument='<%#Eval("CatId") & "^" & Eval("CheckedOut")%>' OnClick="ChangeStatus" CssClass="btn btn-default" Font-Bold="True" />
好的,我删除了你的 PostBack=False。
及以上 - 更改状态事件?看起来不对。
我们不能简单地双击列表视图的“内部”按钮来连接点击事件 - 但您可以并且应该从这样的标记中执行此操作:
在标记中键入 OnClick=
当你点击 = 时,你会得到这个:
选择创建新事件。好像什么都没发生。
标记将变为:
<asp:Button ID="btnChangeStatus" runat="server" Text="Button"
OnClick="btnChangeStatus_Click"
/>
所以,现在我们可以去后面的代码,我们有我们的点击事件。
您可以点击该行并以任何您想要的方式使用该行:
Protected Sub btnChangeStatus_Click(sender As Object, e As EventArgs)
Dim btn As Button = sender
Dim lvRow As ListViewItem = btn.NamingContainer
' now our code is anything we want, say simular to item data bound event.
Dim ckBox As CheckBox = lvRow.FindControl("ActiveCheckBox")
Dim txtActive As Label = lvRow.FindControl("ActiveText")
Dim onerow As HtmlTableRow = lvRow.FindControl("onerow")
If ckBox.Checked = False Then
txtActive.Text = "Dont use"
' set whole row to red (light red
onerow.BgColor = "LightCoral"
Else
txtActive.Text = "Use Me"
' set whole row to red (light red
onerow.BgColor = "Lightskyblue"
End If
' -------- or get command arugments????
Dim str = btn.CommandArgument
End Sub
或者,您的代码在上述事件中会这样说:
' -------- or get command arugments????
Dim btnChangeStatus As Button = sender
Dim lvRow As ListViewItem = btn.NamingContainer
Dim chkStatus As CheckBox = lvRow.FindControl("chkStatus")
Dim lblStatus As Label = lvRow.FindControl("lblStatus")
If chkStatus.Checked = False Then
btnChangeStatus.Text = "Check Out"
Else
btnChangeStatus.Text = "Check In"
lblStatus.ForeColor = Drawing.Color.Red
End If
所以,我们得到按钮,得到容器(列表视图行),然后按照上面的代码进行编码。所以上面是“smaple”,但你可以按照上面的方法为单行按钮点击任何你想要的代码。
【讨论】:
Albert,谢谢...。感谢您为我提供的完整解决方案和解释。它完美地工作!!!!以上是关于根据行值更改整行的颜色的主要内容,如果未能解决你的问题,请参考以下文章