基于存储过程中的非布尔值检查网格视图中的复选框
Posted
技术标签:
【中文标题】基于存储过程中的非布尔值检查网格视图中的复选框【英文标题】:Check Checkboxes in a gridview based on a non-boolean value from a stored procedure 【发布时间】:2016-02-23 07:58:34 【问题描述】:我正在尝试根据下拉列表中的选择来检查 gridview 的某些行上的复选框。我有一个gridview,其中第一列是一个复选框(cb_pain),第二列是一个ID(DrugID)。用户从下拉列表中进行选择,这会触发一个存储过程。存储过程返回所有需要检查的 DrugID。我可以像这样从数据中提取 DrugID:dt.Rows(0)("pain1").ToString() 这告诉我需要检查的行的 DrugID。
基本上我想选中 DrugID = dt.Rows(0)("pain1").ToString() 行上的复选框
我认为这需要在下拉的 selectedindexchange 上完成。
我的 gridview 看起来像这样:(对不起,我不知道如何制表)
cb_pain........药物ID......字段1 x.......................3.......其他数据 x.................................23.................其他数据 x.................................24.................其他数据 x.................................37.................其他数据
如何使用它来检查具有正确 DrugID 的行上的复选框?
我尝试了几种不同的 DirectCast 方法,但都没有成功。谁能指出我正确的方向?
谢谢
【问题讨论】:
也许如果你发布你的代码“aspx文件和代码后面”我可以在一分钟内完成。 @glitzsfa - 还记得将答案标记为已接受,当您获得足够的声誉时,请投票支持有助于解决您问题的答案。欢迎使用 Stack Overflow! 谢谢,会做的!感谢您的帮助。 【参考方案1】:我更喜欢的另一个选项是使用 GridView 的 RowDataBound
事件。当每一行都有数据绑定到它时,这个事件就会被调用。你要做的是找到DrugID
控件并检查它的值。如果它是你想要的,做点什么。
首先,让您的 GridView 知道该事件。
<asp:GridView ID="gvDrugs" runat="server" OnRowDataBound="gvDrugs_RowDataBound">
</asp:GridView>
然后处理事件。如果DrugID
是23,找到CheckBox并勾选。
Protected Sub gvDrugs_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim lblDrugID As Label = e.Row.FindControl("lblDrugID")
If lblDrugID.Text = "23" Then
Dim cbPain As CheckBox = e.Row.FindControl("cbPain")
cbPain.Checked = True
End If
End If
End Sub
**注意这里我假设控件的类型是标签和复选框。你还没有显示你的标记,所以这是我能做的最好的。
在您编辑之后,我可能会同意您的看法。这可以在 DropDownList 的SelectedIndexChanged
事件中完成。获取需要检查的DrugIDs
列表并迭代 GridView 的每一行,检查匹配的那些。
Protected Sub dropdown_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim uniqueDrugIDs As HashSet(Of String) = New HashSet(Of String)()
' Here we assume dt is some sort of global variable as your question above implies
For Each dr As DataRow In dt.Rows
uniqueDrugIDs.Add(dr("drugID").ToString())
Next
For Each gvRow As GridViewRow In gvDrugs.Rows
Dim lblDrugID As Label = gvRow.FindControl("lblDrugID")
If (uniqueDrugIDs.contains(lblDrugID.Text)) Then
Dim cbPain As CheckBox = gvRow.FindControl("cbPain")
cbPain.Checked = True
End If
Next
End Sub
【讨论】:
我喜欢你在这里所做的。您对标签和复选框的假设是正确的。当用户从下拉列表中选择某些内容时,我的网格已经加载并绑定了数据。在下拉列表中的 selectedindexchange 之后,我可能需要将其关闭。更改下拉菜单后,如何修改您的代码以选中正确的框? 如果没有更多信息,这很难说。如果您可以在问题中添加您实际需要发生的事情,那将有所帮助。例如,下拉菜单实际上做了什么?它会改变数据源吗?它会改变选中复选框的条件吗?等等…… 看看我的编辑。这至少应该为您指明正确的方向。【参考方案2】:您可以选择遍历所有行的那种循环:
for (int x = 0; x < NameOfYourGrid.Rows.Count; x++)
GridViewRow row = (GridViewRow)NameOfYourGrid.Rows[x];
if(row("pain1").ToString() == "23")
CheckBox chk = (CheckBox)row.Cells[0].FindControl("The_Name_Of_The_Control");
或者,如果您想在绑定上执行此操作;
在 .aspx 文件中,在您的复选框上放置一个显式属性:
<asp:CheckBox ID="chkInside" runat="server" Checked='<%# CheckForChecked(Container.DataItem as Whatever_the_object_is) %>' ></asp:CheckBox>
并在后面的代码中链接该事件:
protected bool CheckForChecked(Whatever_the_object_is OBJ)
try
return (bool) OBJ.Boolean_value;
// here you are supposed to have a compete Object
// OBJ.ID is suposed to be the rigth id
catch
return false;
如果gridview绑定上的值为真,那么checkBox会被检查。如果您的绑定正确完成,您将不需要 ID。
【讨论】:
如何将数据库返回的 DrugID 值关联到网格中的 DrugID? 您是否使用了正确的绑定?我要编辑我的答案 等等,这不是我需要的 您只需要检索 checkBox 选中的属性? 我需要将该框设置为选中,而不仅仅是检索属性【参考方案3】:我接受了 j-f 的回应,并在正确的位置让它发挥作用。在填充数据集的最后,我添加了以下代码:
Dim row As GridViewRow
For Each row In gv_pain.Rows
If row.RowType = DataControlRowType.DataRow Then
Dim lblDrugID As Label = row.FindControl("lbl_DrugID")
If lblDrugID.Text = dt.Rows(0)("pain1").ToString() Then
Dim cbPain As CheckBox = row.FindControl("CheckBoxPain")
cbPain.Checked = True
End If
End If
Next
这会遍历我的行并检查正确的行。
【讨论】:
您知道,这只检查数据表第一行的“pain1”。如果您有多个“pain1”必须检查或其他什么,这将无法正常工作。以上是关于基于存储过程中的非布尔值检查网格视图中的复选框的主要内容,如果未能解决你的问题,请参考以下文章
无法在网格视图中显示存储中的 Json 数据(使用 Sencha 框架)