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

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

谁能提出一种方法来确定发射OnCheckedchanged事件的复选框来自哪一行?还是您可以提出一种更好的方法来实现我需要做的事情?

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

有帮助吗?

解决方案

您可以通过在行上迭代来找到检查复选框。

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

这并不像看起来那样效率低下(当网格的Pageize不太高时)。

您还可以通过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 是另一个(我认为最好的)选项:

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

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

其他提示

我认为没有办法如说明 RowEditing, RowUpdating, , 和 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") 为了获得控制,您需要 - 假设这种funcitonality对您仍然至关重要。

编辑: 我只是阅读了您的更新,我不确定您在这里要实现的目标。听起来您熟悉 CommandField. 。当您检查必须独立完成行状态的复选框时,您希望您的网站做什么?

编辑2: 你也可以铸造 object sender 给你 CheckBox, ,找到合适的 GridRow 使用 .Parent(), ,但这对我来说总是非常骇人听闻。

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

我从未尝试过,但是您可以参考 CheckBox.ClientID 并尝试通过GridView中的每一行,并致电 GridViewRow.FindControl(CheckBox.ClientID). 。不过,我真的不知道这是否会起作用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top