Измените цвет всей строки на основе значения строки

#html #asp.net #vb.net

#HTML #asp.net #vb.net

Вопрос:

Пытаюсь сделать всю строку красной, если объект извлечен / зарегистрирован. вот мой текущий код, я знаю, что это может быть просто, но я нуб.

 lt;ItemTemplategt;  lt;tr id="trId" runat="server"gt;  lt;td style="text-align: left;"gt;  lt;%#Eval("Name")%gt;  lt;/tdgt;  lt;td style="text-align: left;"gt;  lt;asp:Label ID="lblDescription" runat="server" Text='lt;%#Eval("Description")%gt;'gt;lt;/asp:Labelgt;  lt;/tdgt;  lt;td style="text-align: left; display: none;"gt;  lt;asp:CheckBox ID="chkStatus" runat="server" Checked='lt;%#Eval("CheckedOut")%gt;' /gt;  lt;/tdgt;  lt;td style="text-align: left;"gt;  lt;asp:Label ID="lblStatus" runat="server" Text='lt;%#Eval("Status")%gt;'gt;lt;/asp:Labelgt;  lt;/tdgt;  lt;td style="text-align: left;"gt;  lt;asp:Label ID="lblLocation" runat="server" Text='lt;%#Eval("Location")%gt;'gt;lt;/asp:Labelgt;  lt;/tdgt;  lt;td style="text-align: left;"gt;  lt;asp:Button ID="btnChangeStatus" Postback="false" runat="server" Width="150"  CommandArgument='lt;%#Eval("CatId") amp; "^" amp; Eval("CheckedOut")%gt;' OnClick="ChangeStatus" CssClass="btn btn-default" Font-Bold="True" /gt;  lt;/tdgt;  lt;td style="text-align: left;"gt;  lt;asp:Button ID="btnEdit" PostBack="false" runat="server" Text="Edit" CssClass="btn btn-default" Width="150"  CommandArgument='lt;%#Eval("CatId")%gt;' OnClick="Edit" /gt;  lt;/tdgt;  lt;/trgt; lt;/ItemTemplategt;  
 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   

Комментарии:

1. В настоящее время он только окрашивает текст в красный цвет в поле lblStatus.

2.Не так много знаю об asp, но работает ли это? Dim row = DirectCast(e.Item.FindControl("trId"), TableRow) row.BackColor = Drawing.Color.Red

Ответ №1:

Хорошо, было бы неплохо, если бы вы заметили, является ли это вид сетки или вид списка.

Тем не менее, глядя на разметку — похоже на представление списка — и они отлично подходят для использования — мой любимый. В то время как представление сетки часто имеет меньшую разметку, когда вы ДЕЙСТВИТЕЛЬНО хотите компоновать более сложные сетки, ListView начинает побеждать (в целом, даже часто общая разметка меньше — и существует ГОРАЗДО больше параметров форматирования/стиля.

Как правило, наиболее подходящий выбор для форматирования строк (или даже одного элемента управления) для данного столбца? используйте событие привязки данных к строке.

Вы также не сообщаете, где/когда/как должен выполняться этот образец кода, который у вас есть?

но на данный момент мы будем предполагать, что вы собираетесь предоставить этому списку некоторые данные.

Также у вас есть две кнопки — но вы установили для кнопок значение postback = false? (Почему??). И на самом деле для кнопок все равно нет обратной связи=»Ложь». Так что уберите это.

Мы можем немного подключить кнопки — но первый шаг состоит в том, чтобы получить наше условное форматирование, и этот «текст» «регистрация» и «выезд» работает в первую очередь для существующих данных. Затем мы сможем справиться с двумя нажатиями кнопок.

итак, мы используем событие, связанное с данными строки. Для этого есть НЕСКОЛЬКО причин, но во время этого «события» вы можете не только получить всю строку представления списка, НО и получить столбцы, ОТСУТСТВУЮЩИЕ в представлении списка, ВО ВРЕМЯ события с привязкой к строке!!!. Поэтому я, возможно, захочу выделить какое — то значение или флаг, которого даже НЕТ на дисплее ListView, но которое было частью источника данных. Это означает, что вам часто не нужно включать некоторые скрытые значения столбцов — так что имейте в виду этот важный совет.

итак, допустим, у нас есть этот список:

 lt;div style="width:50%"gt;  lt;asp:ListView ID="ListView1" runat="server" DataKeyNames="ID"gt;  lt;ItemTemplategt;  lt;tr style=""gt;  lt;tdgt;  lt;asp:Label ID="FirstNameLabel" runat="server" Text='lt;%# Eval("FirstName") %gt;' /gt;  lt;/tdgt;  lt;tdgt;  lt;asp:Label ID="LastNameLabel" runat="server" Text='lt;%# Eval("LastName") %gt;' /gt;  lt;/tdgt;  lt;tdgt;  lt;asp:Label ID="CityLabel" runat="server" Text='lt;%# Eval("City") %gt;' /gt;  lt;/tdgt;  lt;tdgt;  lt;asp:Label ID="Desciption" runat="server" Text='lt;%# Eval("Description") %gt;' /gt;  lt;/tdgt;  lt;tdgt;  lt;asp:CheckBox ID="ActiveCheckBox" runat="server" Checked='lt;%# Eval("Active") %gt;' /gt;  lt;/tdgt;  lt;tdgt;  lt;asp:label ID="ActiveText" runat="server" /gt;  lt;/tdgt;  lt;/trgt;  lt;/ItemTemplategt;  lt;LayoutTemplategt;  lt;table id="itemPlaceholderContainer" runat="server" border="0" class="table"gt;  lt;tr runat="server" style=""gt;  lt;th runat="server"gt;FirstNamelt;/thgt;  lt;th runat="server"gt;LastNamelt;/thgt;  lt;th runat="server"gt;Citylt;/thgt;  lt;th runat="server"gt;Descripitonlt;/thgt;  lt;th runat="server"gt;Activelt;/thgt;  lt;th runat="server"gt;Active Textlt;/thgt;  lt;/trgt;  lt;tr id="itemPlaceholder" runat="server"gt;  lt;/trgt;  lt;/tablegt;  lt;/LayoutTemplategt;  lt;/asp:ListViewgt;  lt;/divgt;  

Not too much markup. We can then fill the LV with this code:

 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"  

Итак, как уже отмечалось, мы используем событие привязки данных к строке.

Но нам нужно добавить «идентификатор» в разметку строки, как это:

 lt;ItemTemplategt;  lt;tr id="onerow" runat="server"gt;  lt;tdgt;  lt;asp:Label ID="FirstNameLabel" runat="server" Text='lt;%# Eval("FirstName") %gt;' /gt;  lt;/tdgt;    

итак, мы назвали это одним рядом.

Теперь в нашем событии, связанном с элементом данных, у нас есть этот код:

 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  

И теперь у нас есть это:

введите описание изображения здесь

Теперь следующая часть-это те два события нажатия кнопок. Мы делаем, можем и хотим получить код для этих двух кнопок.

Так что сначала это:

 lt;td style="text-align: left;"gt;  lt;asp:Button ID="btnChangeStatus" runat="server" Width="150"  CommandArgument='lt;%#Eval("CatId") amp; "^" amp; Eval("CheckedOut")%gt;' OnClick="ChangeStatus" CssClass="btn btn-default" Font-Bold="True" /gt;  

Ok, I removed your PostBack=False.

And above — Change Status event? that does not look right.

We can’t easy double click on the button «inside» of the listview to wire up a click event — but you CAN AND SHOULD do this from markup like this:

In the markup Type in OnClick=

when you hit =, you get this:

enter image description here

choose create new event. Looks like nothing occurred.

the markup will change to:

 lt;asp:Button ID="btnChangeStatus" runat="server" Text="Button"  OnClick="btnChangeStatus_Click"  /gt;  

Итак, теперь мы можем перейти к коду позади, и у нас есть событие 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», но у вас может быть любой код, который вы хотите, для нажатия кнопки с одной строкой, как указано выше.

Комментарии:

1. Альберт, спасибо тебе…. Я ценю все решение и объяснение, которые вы мне предоставили. Это работает идеально!!!!