我有一个带有模板化字段列的数据绑定网格,它是一个复选框。当用户选中该复选框时,它将自动后退并更新该行以指示该框的检查状态。
我的第一次尝试是简单地使用OnCheckedChanged方法,但是当调用它时,我无法知道复选框来自哪一行。因此,我不知道要更新哪一行。
有人可以建议一种方法来确定触发oncheckedchanged事件的复选框来自哪一行?或者你能建议一个更好的方法来实现我需要做的事情吗?
我无法将复选框绑定到数据列,因为我不希望在选择模式下禁用复选框,并且不希望要求用户进入编辑模式以更改值。我还需要所有行都可以编辑。因此,最好的路线似乎是模板化的专栏。
答案 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)
我认为如果没有处理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()
,但这始终是CheckBox.ClientID
我觉得非常讨厌。
编辑3:我发誓,我最终会停止编辑。
我从来没有尝试过这个,但你可以获得对GridViewRow.FindControl(CheckBox.ClientID)
的引用,并尝试遍历GridView中的每一行,并调用{{1}}。我真的不知道这是否会奏效。