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

本文关键字:项目 列表 无效 因为 SelectedValue | 更新日期: 2023-09-27 18:20:30

这是我得到的错误:

ddlRankEdit"具有无效的SelectedValue,因为它没有存在于项目列表中。参数名称:值

我有一个包含多个下拉列表的表单,这些下拉列表嵌套在一个默认设置为不可见的面板中。当用户从单独的列表框中选择记录时,所选索引更改事件会将面板设置为可见,并进行数据调用。这就是错误发生的时候。请参阅下面的代码,我在它停止的地方添加了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;
    }
}

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

错误消息准确地告诉您发生了什么:例如,存储在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>