2

我不知道这是否可能,但我试图设置 a asp:CheckBox, in a FormView, to Checked=Trueif a value in a database = yes|no|pending etc...

这是后面的代码(在 PreRender Sub 中):

    Dim rowHiredStatus As DataRowView = CType(fvRecruitInterviewed.DataItem, DataRowView)

    Dim lblTestHiredStatus As Label = CType(fvRecruitInterviewed.FindControl("lblTestHiredStatus"), Label)

    Dim chkHiredPending As CheckBox = CType(fvRecruitInterviewed.FindControl("chkHiredPending"), CheckBox)
    Dim chkHiredNo As CheckBox = CType(fvRecruitInterviewed.FindControl("chkHiredNo"), CheckBox)
    Dim chkHiredYes As CheckBox = CType(fvRecruitInterviewed.FindControl("chkHiredYes"), CheckBox)

    If Not IsNothing(rowHiredStatus) Then

        Dim strHiredStatus As String
        strHiredStatus = rowHiredStatus("HiredStatus").ToString()
        lblTestHiredStatus.Text = strHiredStatus

        If strHiredStatus = "yes" Then
            chkHiredYes.Checked = True
            lblTestHiredStatus.Text = strHiredStatus
        ElseIf (strHiredStatus = "no") Then
            chkHiredNo.Checked = True
            lblTestHiredStatus.Text = strHiredStatus
        Else
            chkHiredPending.Checked = True
            lblTestHiredStatus.Text = strHiredStatus
        End If

    End If

在设计视图中:

    <asp:CheckBox ID="chkHiredPending" runat="server" Text="Pending" />
    <br />
    <asp:CheckBox ID="chkHiredNo" runat="server" Text="Not Hired"/>
    <br />
    <asp:CheckBox ID="chkHiredYes" runat="server" Text="Hired" />

    <br />
    <asp:Label ID="lblTestHiredStatus" runat="server" />

令人沮丧的是,测试标签显示正确的数据,但复选框不会改变。它只是默认为待处理的复选框。

使用一个RadioButton组或者RadioButtonList会很好,如果这更容易/可能的话

4

2 回答 2

0

我在 ASP.Net 论坛上找到了一个问题/答案,帮助我回答了我的问题: Binding CheckBoxList in FormView

我像这样实现它:

//设计视图

<asp:CheckBoxList ID="cblHiredStatus" runat="server" DataTextField="hiredstatus" DataValueField="hiredstatus">
    <asp:ListItem Value="pending">Pending</asp:ListItem>
    <asp:ListItem Value="no">Not Hired</asp:ListItem>
    <asp:ListItem Value="yes">Hired</asp:ListItem>            
</asp:CheckBoxList>

//代码后面

 Dim cblHiredStatus As CheckBoxList = CType(fvRecruitInterviewed.FindControl("cblHiredStatus"), CheckBoxList)

 If cblHiredStatus IsNot Nothing Then
      Dim csv As String = DataBinder.Eval(fvRecruitInterviewed.DataItem, "HiredStatus").ToString()
      If Not String.IsNullOrEmpty(csv) Then
           Dim hiredstatus As String() = csv.Split()
           For Each str As String In hiredstatus
                If cblHiredStatus.Items.FindByValue(str) IsNot Nothing Then
                     cblHiredStatus.Items.FindByValue(str).Selected = True
                End If
           Next
      End If
 End If
于 2013-07-05T20:48:25.350 回答
0

根据对问题的描述和代码,我愿意硬着头皮说问题出在strHiredStatus的值上。

由于 Pending 被检查,我们知道代码被触发,并且在代码中,pending 是 If 语句中的默认子句,这意味着问题必须与 strHiredStatus 的测试有关。

当你用等号测试一个字符串时,它是一个区分大小写的测试。这意味着“是”与“是”不同。

有不同的方法可以解决这个问题,但我首选的方法是使用不区分大小写和区域性的String.Equals方法:

If strHiredStatus.Equals("yes", StringComparison.InvariantCultureIgnoreCase) Then
    chkHiredYes.Checked = True
    lblTestHiredStatus.Text = strHiredStatus
ElseIf strHiredStatus.Equals("no", StringComparison.InvariantCultureIgnoreCase) Then

文化不敏感的原因(我之前已经被烧毁了),是如果你有一个字符串常量并且只是将常量字符串转换为小写,那么在国际运行时你会得到意想不到的结果。

比如在土耳其语环境下运行时,大写的i不会转成英文小写的i,会转成土耳其语的i(不知道这个字符的正确名字是什么,但是不一样特点)。

于 2013-07-03T00:18:50.733 回答