3

我正在尝试根据下拉列表中的选择来检查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............ ................................其他数据
x.................................23 ..其他数据
x.......................24........其他数据
x....... ..........37..................其他数据

如何使用它来检查具有正确 DrugID 的行上的复选框?

我尝试了几种不同的 DirectCast 方法,但没有成功。谁能指出我正确的方向?

谢谢

4

3 回答 3

2

我倾向于另一个选择是利用RowDataBoundGridView 的事件。当每一行都有数据绑定到它时,这个事件就会被调用。你要做的是找到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

**请注意,我假设控件的类型是标签和复选框。你没有显示你的标记,所以这是我能做的最好的。

在你的编辑之后,我可能会同意你的看法。SelectedIndexChanged这是在 DropDownList 事件中可以完成的事情。获取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
于 2015-11-20T19:33:18.983 回答
1

您可以使用将遍历所有行的那种循环:

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绑定上为真。如果您的绑定正确完成,您将不需要该 ID。

于 2015-11-20T18:20:11.497 回答
0

我接受了 jf 的回应,并让它在正确的位置工作。在填充数据集的最后,我添加了以下代码:

    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

这会遍历我的行并检查正确的行。

于 2015-11-20T21:38:57.740 回答