使用autopostback从模板化复选框选择中确定网格行

时间:2010-11-02 22:20:09

标签: asp.net gridview checkbox autopostback oncheckedchanged

我有一个带有模板化字段列的数据绑定网格,它是一个复选框。当用户选中该复选框时,它将自动后退并更新该行以指示该框的检查状态。

我的第一次尝试是简单地使用OnCheckedChanged方法,但是当调用它时,我无法知道复选框来自哪一行。因此,我不知道要更新哪一行。

有人可以建议一种方法来确定触发oncheckedchanged事件的复选框来自哪一行?或者你能建议一个更好的方法来实现我需要做的事情吗?

我无法将复选框绑定到数据列,因为我不希望在选择模式下禁用复选框,并且不希望要求用户进入编辑模式以更改值。我还需要所有行都可以编辑。因此,最好的路线似乎是模板化的专栏。

2 个答案:

答案 0 :(得分:1)

您可以通过遍历行找到已选中的复选框。

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的PageSize不是太高时)。

您还可以通过Checkbox.Parent.Parent获取GridViewRow:

  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更快但是如果你f.e.将来会将Checkbox嵌套在一个表格中,如果不进行调整,这将无法使用。

我通常更喜欢选项1,因为在事件处理程序中,一毫秒或多或少都无关紧要。

<小时/> 更新:通过NamingContainer获取GridViewRow是另一种(在我看来最好的)选项:

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

当您将Checkbox嵌套在其他控件(如表格)中时,这仍然有效。

答案 1 :(得分:0)

我认为如果没有处理RowEditingRowUpdatingRowCancelingEdit事件,就无法按照规定执行此操作。

或者,我建议在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(),但这始终是CheckBox.ClientID我觉得非常讨厌。

编辑3:我发誓,我最终会停止编辑。

我从来没有尝试过这个,但你可以获得对GridViewRow.FindControl(CheckBox.ClientID)的引用,并尝试遍历GridView中的每一行,并调用{{1}}。我真的不知道这是否会奏效。