0

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

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

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

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

4

2 回答 2

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 更快,但如果您将来将复选框嵌套在表格中,那么如果不进行调整,这将不再起作用。

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


更新:通过NamingContainer获取 GridViewRow是另一个(在我看来是最好的)选项:

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

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

于 2010-11-02T22:27:44.020 回答
0

我认为如果不处理 、 和 事件,就没有办法做到RowEditingRowUpdating一点RowCancelingEdit

或者,我建议在 中添加一个CommandFieldGridView如下所示:

<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, 并找到合适的GridRowusing .Parent(),但这对我来说一直感觉非常hacky。

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

我从未尝试过,但您可以参考CheckBox.ClientID并尝试遍历 GridView 中的每一行,然后调用GridViewRow.FindControl(CheckBox.ClientID). 不过,我真的不知道这是否可行。

于 2010-11-02T22:38:42.333 回答