根据行值更改整行的颜色
Change color of entire row based on row value
如果对象被签出/签入,尝试使整个行变为红色。这是我当前的代码,我知道这可能很简单,但我是菜鸟。
<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
好的,如果您注意到这是 GridView 还是 ListView,那就太好了。
但是,查看标记 - 看起来像 ListView - 它们是一个很好用的控件 - 我最喜欢的。虽然 GridView 通常标记较少,但当您真的想要布局更复杂的网格时,ListView 开始获胜(总的来说,甚至通常标记更少 - 并且存在更多 formatting/style 选项。
作为一般规则,给定列的行格式(甚至单个控件)的最合适选择是什么?使用行数据绑定事件。
您也不分享 where/when/how 您拥有的示例代码 运行?
但是,目前,我们假设您要为该列表视图提供一些数据。
您还有两个按钮 - 但您为按钮设置了 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”,但是您可以按照上面的方法为单行按钮单击添加任何代码。
如果对象被签出/签入,尝试使整个行变为红色。这是我当前的代码,我知道这可能很简单,但我是菜鸟。
<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
好的,如果您注意到这是 GridView 还是 ListView,那就太好了。
但是,查看标记 - 看起来像 ListView - 它们是一个很好用的控件 - 我最喜欢的。虽然 GridView 通常标记较少,但当您真的想要布局更复杂的网格时,ListView 开始获胜(总的来说,甚至通常标记更少 - 并且存在更多 formatting/style 选项。
作为一般规则,给定列的行格式(甚至单个控件)的最合适选择是什么?使用行数据绑定事件。
您也不分享 where/when/how 您拥有的示例代码 运行?
但是,目前,我们假设您要为该列表视图提供一些数据。
您还有两个按钮 - 但您为按钮设置了 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”,但是您可以按照上面的方法为单行按钮单击添加任何代码。