Определение строки сетки из шаблонного выбора флажков с автоподведомлением

StackOverflow https://stackoverflow.com/questions/4082607

Вопрос

У меня есть сетка по билету с столбцом поля шаблона, который является флажком. Когда пользователь проверяет флажок, он будет автоматически обновлять и обновлять строку, чтобы указать состояние проверки блока.

Моя первая попытка была просто использовать метод OnCheckEnceChanged, но когда это позвонится, у меня нет способа узнать, откуда пришел флажок. Таким образом, я не знаю, какой ряд обновляется.

Может кто-нибудь предложить метод, чтобы определить, из которого появился флажок, который загорелся событие OnCheckedChangedChangedChanged? Или вы можете предложить лучший способ достичь того, что мне нужно сделать?

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

Это было полезно?

Решение

Вы можете найти проверенный флажок, итерацией по рядам.

Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    For Each row As GridViewRow In GridView1.Rows
        Dim cb As CheckBox = DirectCast(row.FindControl("MyCheckBoxID"), CheckBox)
        If sender Is cb AndAlso cb.Checked Then
            'Do something ...'
            Exit For
        End If
    Next
End Sub

Это не так неэффективно, как выглядит (когда страница сетки не слишком высока).

Вы также можете получить GridViewRow через CheckBox.parent.parent:

  Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim cb As CheckBox = DirectCast(sender, CheckBox)
        Dim row As GridViewRow = DirectCast(cb.Parent.Parent, GridViewRow)
        row.BackColor = DirectCast(IIf(cb.Checked, Color.Red, Color.White), Color)
  End Sub

Это быстрее, как вариант 1, но если вы ve lette The CheckBox в таблице в будущем это не будет работать без регулировки.

Я бы обычно предпочитаю вариант 1, потому что в обработке событий один миллисекундой более или менее не имеет значения.


Обновлять: Получение GridViewrow через Namingcontainer. Есть еще один (на мой взгляд лучший) вариант:

Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

Это даже все еще работает, когда вы устанавливаете флажок внутри других элементов управления, как таблица.

Другие советы

Я не думаю, что есть способ сделать это, как указано без обработки RowEditing, RowUpdating, а также RowCancelingEdit Мероприятия.

В качестве альтернативы, я бы предложил добавить CommandField к тому GridView, вот так:

<asp:CommandField ShowSelectButton="true" />

Вам нужно будет обрабатывать GRIDVIEW.Selectedindexchanging, снова так:

    void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        GridView.SelectedIndex = e.NewSelectedIndex;
    }

Как только вы введете SelectedIndexChanging, вы можете использовать GridView.Rows[e.NewSelectedIndex].FindControl("id") Чтобы получить нужную вам контроль - предполагая, что эта функциональность все еще имеет решающее значение для вас.

Редактировать: Я просто прочитал ваше обновление, и я не совсем уверен, что вы пытаетесь достичь здесь. Похоже, вы знакомы с CommandField. Отказ Что вы хотите, чтобы ваш сайт сделать, когда проверяете этот флажок, который должен быть выполнен независимо от состояний строки?

Редактировать 2: Вы также можете бросить object sender на ваш CheckBox, и найдите соответствующую GridRow с использованием .Parent(), но это всегда чувствовало себя очень взлом для меня.

Редактировать 3: Клянусь, я собираюсь перестать редактировать это в конце концов.

Я никогда не пробовал это, но вы можете получить ссылку на CheckBox.ClientID и попробуйте пройти через каждую строку в GridView, а звонить GridViewRow.FindControl(CheckBox.ClientID). Отказ Я действительно понятия не имею, если это будет работать, хотя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top