#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:
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. Альберт, спасибо тебе…. Я ценю все решение и объяснение, которые вы мне предоставили. Это работает идеально!!!!