簡體   English   中英

根據存儲過程中的非布爾值檢查gridview中的復選框

[英]Check Checkboxes in a gridview based on a non-boolean value from a stored procedure

我試圖根據下拉列表中的選擇來檢查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,但沒有成功。 誰能指出我正確的方向?

謝謝

我傾向於選擇的另一個選項是使用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

您可以選擇那種遍歷所有行的循環:

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。

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

這遍歷我的行並檢查正確的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM