C# SelectedValue无效,因为它不在项目列表中

C# SelectedValue无效,因为它不在项目列表中,c#,asp.net,C#,Asp.net,这是我得到的错误: Ddlankedit'有一个SelectedValue,该值无效,因为它没有 存在于项目列表中。参数名称:value 我有一个表单,它包含多个下拉列表,这些下拉列表嵌套在默认设置为不可见的面板中。当用户从单独的列表框中选择记录时,selected index changed事件将面板设置为可见并进行数据调用。这就是错误发生的时候。看到下面的代码,我添加了XXX在那里它暂停 <asp:DropDownList runat="server" ID="ddlRankEdit"

这是我得到的错误:

Ddlankedit'有一个SelectedValue,该值无效,因为它没有 存在于项目列表中。参数名称:value

我有一个表单,它包含多个下拉列表,这些下拉列表嵌套在默认设置为不可见的面板中。当用户从单独的列表框中选择记录时,selected index changed事件将面板设置为可见并进行数据调用。这就是错误发生的时候。看到下面的代码,我添加了XXX在那里它暂停

<asp:DropDownList runat="server" ID="ddlRankEdit" CssClass="txtfield" DataSourceID="ODCRanks"
  DataTextField="Rank" DataValueField="ID" AppendDataBoundItems="True">
  <asp:ListItem Text="--- Select a Rank ---" Value="-1" />                                            
  </asp:DropDownList>
  <asp:ObjectDataSource ID="ODCRanks" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetRanks" 
    TypeName="RanksTableAdapters.RankTableAdapter"></asp:ObjectDataSource>

protected void lboxManageMembers_SelectedIndexChanged(object sender, EventArgs e)
{
    pnlReviewMemberDetails.Visible = false;
    pnlUnlockUserAccount.Visible = false;
    pnlAdmins.Visible = false;
    pnlCreateAdmins.Visible = false;
    lblNote.Visible = false;
    pnlManageMenbers.Visible = true;

    MembershipUser user = Membership.GetUser();
    DataSetTableAdapters.MemberInfoTableAdapter da = new DataSetTableAdapters.MemberInfoTableAdapter();

    Guid _memberId = Guid.Empty;
    _memberId = new Guid(lbxManageMembers.SelectedValue);
    DataSet.MemberInfoDataTable dt = da.GetMember(_memberId);
    if (dt.Rows.Count == 1)
    {
        DataSet.MemberInfoRow mr = dt[0];

   XXX ddlRankEdit.SelectedValue = Convert.ToString(mr.rankid);
   XXX ddlPatrolEdit.SelectedValue = Convert.ToString(mr.patrolid);
   XXX ddlPositionEdit.SelectedValue = Convert.ToString(mr.bsaposid);

        txtFirstNameEdit.Text = mr.firstname;
        txtLastNameEdit.Text = mr.lastname;
        txtEmailEdit.Text = user.Email;
        txtAddressEdit.Text = mr.address;
        txtPhoneEdit.Text = mr.phone;
        txtCellPhoneEdit.Text = mr.altphone;
        txtAltEmailEdit.Text = mr.altemail;

        txtMotherFirstNameEdit.Text = mr.parentfn;
        txtMotherLastNameEdit.Text = mr.parentln;
        txtMotherWorkPhoneEdit.Text = mr.parentworkphone;
        txtMotheHomePhoneEdit.Text = mr.parentworkphone;
        txtMotherCellkPhoneEdit.Text = mr.parentscellphone;
        txtMotherTwitterEdit.Text = mr.parenttwitter;
        txtMotherEmailEdit.Text = mr.parentemail;
        txtMotherAltEmailEdit.Text = mr.parentemailalt;

        txtFatherFirstNameEdit.Text = mr.parent2fn;
        txtFatherLastNameEdit.Text = mr.parent2ln;
        txtFatherWorkPhoneEdit.Text = mr.parent2workphone;
        txtFatherHomePhoneEdit.Text = mr.parent2workphone;
        txtFatherCellPhoneEdit.Text = mr.parent2cellphone;
        txtFatherTwitterEdit.Text = mr.parent2twitter;
        txtFatherEmailEdit.Text = mr.parent2email;
        txtFatherAltEmailEdit.Text = mr.parent2emailalt;
    }

}

受保护的void lboxManageMembers\u SelectedIndexChanged(对象发送方,事件参数e)
{
pnlReviewMemberDetails.Visible=false;
pnlUnlockUserAccount.Visible=false;
pnlAdmins.Visible=false;
pnlCreateAdmins.Visible=false;
lblNote.Visible=false;
pnlManageMenbers.Visible=true;
MembershipUser=Membership.GetUser();
DataSetTableAdapters.MemberInfoTableAdapter da=新的DataSetTableAdapters.MemberInfoTableAdapter();
Guid _memberId=Guid.Empty;
_memberId=新Guid(lbxManageMembers.SelectedValue);
DataSet.MemberInfoDataTable dt=da.GetMember(_memberId);
如果(dt.Rows.Count==1)
{
DataSet.MemberInfoRow mr=dt[0];
XXX ddlRankEdit.SelectedValue=Convert.ToString(mr.rankid);
XXX ddlparroledit.SelectedValue=Convert.ToString(mr.patrolid);
XXX ddlPositionEdit.SelectedValue=Convert.ToString(mr.bsaposid);
txtFirstNameEdit.Text=mr.firstname;
txtlastnamedit.Text=mr.lastname;
txtEmailEdit.Text=user.Email;
txtAddressEdit.Text=mr.address;
txtPhoneEdit.Text=mr.phone;
txtCellPhoneEdit.Text=mr.altphone;
txtaltmailedit.Text=mr.altemail;
txtmotherfirstnamedit.Text=mr.parentfn;
txtmotherlastnamedit.Text=mr.parentln;
txtMotherWorkPhoneEdit.Text=mr.parentworkphone;
txtmosehomephoneedit.Text=mr.parentworkphone;
txtMotherCellkPhoneEdit.Text=mr.parentscellphone;
txtMotherTwitterEdit.Text=mr.parenttwitter;
txtMotherEmailEdit.Text=mr.parentemail;
txtMotherAltEmailEdit.Text=mr.parentemailalt;
txtFatherFirstNameEdit.Text=mr.parent2fn;
txtFatherLastNameEdit.Text=mr.parent2ln;
txtFatherWorkPhoneEdit.Text=mr.parent2workphone;
txtFatherHomePhoneEdit.Text=mr.parent2workphone;
txtFatherCellPhoneEdit.Text=mr.parent2cellphone;
txtfatherwitteredit.Text=mr.parent2twitter;
txtFatherEmailEdit.Text=mr.parent2email;
txtfaterratemailedit.Text=mr.parent2emailalt;
}
}

错误消息准确地告诉您发生了什么:dropdownlist中不存在存储在mr.rankid中的值

您需要确定dropdownlist是否包含正确的值,或者您尝试分配的值在可用值列表中是否不存在

更新

由于似乎是包含面板的可见性导致了问题,因此最好使用CSS隐藏面板,而不是将
Visible
属性设置为false,这将阻止它呈现到页面

这可以通过代码隐藏中类似于以下内容的代码来完成:

Panel1.Style.Add(HtmlTextWriterStyle.Visibility, "Hidden");
Panel1.Style.Add(HtmlTextWriterStyle.Display, "None");

按如下方式修改代码:

if (dataTable1.Rows[0]["columnName"].ToString() != "" && dataTable1.Rows[0]["columnName"] != null)
    DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue(dataTable1.Rows[0]["columnName"].ToString()));

当您不需要使用数据源时,可以使用以下代码在EditTemplate中使用dropdownlist:

<asp:TemplateField HeaderText="state" SortExpression="state">
          <EditItemTemplate>
                <asp:DropDownList ID="DropDownList4" runat="server" Style="position: relative"  AppendDataBoundItems="true" SelectedValue='<%# Bind("state") %>'  >
       <asp:ListItem Value="approved">approved</asp:ListItem>
       <asp:ListItem Value="notapproved">notapproved</asp:ListItem>
    </asp:DropDownList>
         </EditItemTemplate>
<ItemTemplate>
             <asp:Label ID="Label1" runat="server" Text='<%# Bind("state") %>'></asp:Label>
         </ItemTemplate>
</asp:TemplateField>

经核准的
未经批准

这是由于面板设置为不可见而导致的生命周期问题吗?数据是正确的。我原以为可能存在页面生命周期问题,但我只是在一个小项目上测试了这一点,发现即使DDList的可见性设置为false,值也能正确地发回。我重现此问题的唯一方法是使用一个实际不在下拉列表中的值列表中的值。不确定您是如何做到的,因为我从一开始就使面板可见,然后在回发时没有错误。它只是一个标准面板还是一个更新面板?我对标准面板没有异议,但可能还有其他问题。由于将Visible设置为true可以解决问题,因此解决方案是使用CSS属性隐藏面板。我已经更新了答案来说明如何做到这一点。