2012-01-14 63 views
4

此列表存在这是无效的是我得到的错误:的SelectedValue,因为它并不在项目

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; 
    } 

} 

回答

3

错误消息告诉你到底发生了什么:值,例如存储在mr.rankid,是不存在的下拉列表。

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

更新

既然是含面板,这似乎是导致问题的知名度,这将是更好地隐藏使用CSS不是设置Visible属性设置为false面板,这将阻止它从渲染到页面。

这可以用类似的代码隐藏在下面的代码来完成:

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

这是由于面板设置为inv而导致的生命周期问题isible?数据是正确的。 – Risho 2012-01-15 01:09:25

+0

我曾经想过可能存在一个页面生命周期问题,但我只是在一个小项目上测试了这个问题,发现即使DDList的可见性设置为false,值也会正确回发。重现此问题的唯一方法是使用实​​际上不在下拉列表中的值列表中的值。 – 2012-01-15 02:09:38

+0

不知道你是如何做到的,因为我从一开始就让面板可见,然后在回发中没有错误。 – Risho 2012-01-15 02:17:39

1

修改这样的代码:

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

您可以在editemplate使用此代码使用下拉列表当您不需要使用数据源时:

<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> 
相关问题