好的,至少显示按钮和几行 gridview 标记会很有帮助。
大约有 10 种方法可以做到这一点。 (真的!!!)。
但是,在您的情况下,有两个复选框,当一个复选框被更改时,您需要执行操作 - 并说更改另一个!
现在我使用了两个复选框 - 但它可以是一个文本框或我更改的任何内容。
所以,假设我有这个网格标记
一些列 + 两个未绑定的复选框。
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" />
<asp:BoundField DataField="HotelName" HeaderText="HotelName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="Province" HeaderText="Province" />
<asp:TemplateField HeaderText="Good">
<ItemTemplate>
<asp:CheckBox ID="chkGood" runat="server"
AutoPostBack="true"
OnCheckedChanged="chkGood_CheckedChanged"
MyRowID ='<%# Container.DataItemIndex %>' />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Bad">
<ItemTemplate>
<asp:CheckBox ID="chkBad" runat="server"
AutoPostBack="true"
OnCheckedChanged="chkBad_CheckedChanged"
MyRowID ='<%# Container.DataItemIndex %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
好的,现在是加载网格的代码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If IsPostBack = False Then
Using cmdSQL As New SqlCommand("SELECT ID, HotelName, City, Province from tblHotels",
New SqlConnection(My.Settings.Test3))
cmdSQL.Connection.Open()
GridView1.DataSource = cmdSQL.ExecuteReader
GridView1.DataBind()
End Using
End If
End Sub
因此我们有这个:
好的,到目前为止 - 非常简单。
现在请注意两个复选框的标记处的 CLOSE。
在普通表单上放置按钮或其他内容时,您可以双击跳转到事件/存根后面的代码?
好吧,对于按钮或任何你放在网格内部的东西,你不能双击控件来创建 + 跳转到存根后面的代码。
但是,在标记中,您可以开始输入事件,然后您会得到:
请注意非常小心 intel-sense 如何弹出创建事件的选项。所以点击那个选项。似乎什么也没发生,但现在我们得到了一个代码存根。
所以,我们有这个 chkOk 事件的代码存根:
Protected Sub chkGood_CheckedChanged(sender As Object, e As EventArgs)
Dim ckBox As CheckBox = sender
Dim RowID As Integer = ckBox.Attributes.Item("MyRowID")
Dim gvRow As GridViewRow = GridView1.Rows(RowID)
If ckBox.Checked = True Then
' do whatever if true - say un-check the "bad" check box
Dim ckBoxBad As CheckBox = gvRow.FindControl("chkBad")
ckBoxBad.Checked = False
Else
' code here if the user just un-checked the "good" check box
End If
End Sub
注意几点:
我们拿起按钮单击 - 然后将其推入复选框控件。这更容易获取复选框值和我们的 CUSTOM MyRowID
(例如,如果它是一个按钮,这将有效)。
然后我们得到我们添加的自定义属性,称为“MyRowID”
MyRowID ='<%# Container.DataItemIndex %>'
您可以在标记中看到表达式 - 它传递了当前行 ID。有时,我会从行中传递其他值,您可以这样做:
<asp:CheckBox ID="chkBad" runat="server"
AutoPostBack="true"
OnCheckedChanged="chkBad_CheckedChanged"
MyRowID ='<%# Container.DataItemIndex %>'
MyPKID = '<%# Eval("ID") %>' />
所以在上面,我同时传递了 RowID 和自定义 MyPKID(因此 Eval() 表达式可用于传递绑定时可用的任何有效数据行。它通常很方便,然后不得不抓取并弄乱数据行 -您只需从发件人那里获取按钮-并且您不关心 gridview 或其他任何东西来获得一些额外的值。(仅供参考)。例如,我真的不希望 PK 行 ID 作为第一个所以我可以删除它并仍然使用上述想法来传递 pk 行 id - 可以使用所有列 - 即使控件不在网格中 - 只要该列在数据绑定过程中存在 - 你可以抓住它。
所以,现在我们选择当前的 GridRow - 我们可以随意修改该行上的任何内容。
在我的简单示例中,我们选中 OTHER 复选框 - 并取消选中它是否已选中。但我们可以说更新该行的其他内容。
我为 chkBad 复选框做了同样的事情。和我的第一个chkBox代码stub一样。例如:
Protected Sub chkBad_CheckedChanged(sender As Object, e As EventArgs)
Dim ckBox As CheckBox = sender
Dim RowID As Integer = ckBox.Attributes.Item("MyRowID")
Dim gvRow As GridViewRow = GridView1.Rows(RowID)
If ckBox.Checked = True Then
' user checked the bad box, un-check the good one
Dim ckBoxGood As CheckBox = gvRow.FindControl("chkGood")
ckBoxGood.Checked = False
Else
' code here if the user just un-checked the "bad" check box
End If
End Sub
所以在上面我们只是很难通过 GridView 插入事件。
所以在上面,如果您选中一个框而另一个被选中 - 我们会取消选中它。不用说,我会使用按钮列表或复选框列表,当然不需要上面的代码。但它仍然是如何采摘/获取当前行的一个很好的例子。然后从该行获取/提取控件。
请注意,对于前 3 行(数据绑定),您不能使用 findControl,它们是使用 gvRow.Cells(0) 引用的(从 0 到 N 列开始。因此这些数据绑定列不需要 findcontrol或自动生成的。它们没有名称 - 您必须在单元格集合中使用从 0 开始的数字。当然对于我们按照上面添加的“模板化”控件?然后您实际上按照上面的方法使用 findcontrol。