Определение строки сетки из выбора шаблонного флажка с автостопом - PullRequest
0 голосов
/ 03 ноября 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Вы можете найти флажок, перебирая строки.

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

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

Вы также можете получить 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, но если вы, например. вложит флажок в таблицу в будущем, это не сработает без настройки.

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


Обновление : получение GridViewRow через NamingContainer - это еще один (на мой взгляд, лучший) вариант:
Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

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

0 голосов
/ 03 ноября 2010

Не думаю, что есть способ сделать это, как указано, без обработки событий 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). Я действительно понятия не имею, будет ли это работать, хотя.

...