根据存储过程中的非布尔值检查gridview中的复选框

时间:2015-11-20 18:08:44

标签: asp.net vb.net gridview checkbox directcast

我正在尝试根据下拉列表中的选项来检查gridview的某些行上的复选框。我有一个gridview,其中第一列是复选框(cb_pain),第二列是ID(DrugID)。用户从下拉列表中进行选择,这将触发存储过程。存储过程返回需要检查的所有DrugID。我可以从这样的数据中提取DrugID:dt.Rows(0)(“pain1”)。ToString()告诉我需要检查的行的DrugID。

基本上我想检查DrugID = dt.Rows(0)(“pain1”)行的复选框.ToString()

我认为这需要在下拉列表的selectedindexchange上完成。

我的gridview看起来像这样:(抱歉点,我无法弄清楚如何标签)

cb_pain ........ DrugID ...............字段1
x ................. 3 ...................其他数据
x ................. 23 .................其他数据
x ................. 24 .................其他数据
x ................. 37 .................其他数据

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

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

由于

3 个答案:

答案 0 :(得分:2)

我倾向于选择的另一个选项是使用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

答案 1 :(得分: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;
        }
    }

然后将检查checkBox,如果gridview绑定上的值为true。如果绑定正确完成,则不需要ID。

答案 2 :(得分:0)

我接受了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

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