根据存储过程中的非布尔值检查 gridview 中的复选框
Check Checkboxes in a gridview based on a non-boolean value from a stored procedure
我正在尝试根据下拉列表中的选择来选中 gridview 某些行上的复选框。我有一个 gridview,其中第一列是一个复选框 (cb_pain),第二列是一个 ID (DrugID)。用户从下拉列表中进行选择,这会触发一个存储过程。存储过程 returns 所有需要检查的 DrugID。我可以像这样从数据中提取 DrugID:dt.Rows(0)("pain1").ToString() 这告诉我需要检查的行的 DrugID。
基本上我想选中 DrugID = dt.Rows(0)("pain1").ToString()
所在行的复选框
我认为这需要在下拉列表的 selectedindexchange 上完成。
我的 gridview 看起来像这样:(对不起,我不知道如何使用 Tab 键)
cb_pain........药物编号......字段 1
x......................3......其他数据
x .....................23 ...............其他数据
x .....................24 ...............其他数据
x......................37.....其他数据
我如何使用它来选中具有正确 DrugID 的行上的复选框?
我尝试了几种不同的 DirectCast 方法,但都没有成功。谁能指出我正确的方向?
谢谢
您可以使用那种遍历所有行的循环:
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>
和link后面代码中的那个事件:
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 绑定上的值为真,则将检查复选框。如果绑定正确,则不需要 ID。
我倾向于使用的另一个选项是使用 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
我接受了 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
这遍历我的行并检查正确的行。
我正在尝试根据下拉列表中的选择来选中 gridview 某些行上的复选框。我有一个 gridview,其中第一列是一个复选框 (cb_pain),第二列是一个 ID (DrugID)。用户从下拉列表中进行选择,这会触发一个存储过程。存储过程 returns 所有需要检查的 DrugID。我可以像这样从数据中提取 DrugID:dt.Rows(0)("pain1").ToString() 这告诉我需要检查的行的 DrugID。
基本上我想选中 DrugID = dt.Rows(0)("pain1").ToString()
所在行的复选框我认为这需要在下拉列表的 selectedindexchange 上完成。
我的 gridview 看起来像这样:(对不起,我不知道如何使用 Tab 键)
cb_pain........药物编号......字段 1
x......................3......其他数据
x .....................23 ...............其他数据
x .....................24 ...............其他数据
x......................37.....其他数据
我如何使用它来选中具有正确 DrugID 的行上的复选框?
我尝试了几种不同的 DirectCast 方法,但都没有成功。谁能指出我正确的方向?
谢谢
您可以使用那种遍历所有行的循环:
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>
和link后面代码中的那个事件:
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 绑定上的值为真,则将检查复选框。如果绑定正确,则不需要 ID。
我倾向于使用的另一个选项是使用 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
我接受了 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
这遍历我的行并检查正确的行。