如何修复“'ddlAssignedTo'有一个无效的SelectedValue,因为它在项目列表中不存在

时间:2013-05-12 00:05:25

标签: asp.net vb.net gridview

我加载了gridview,gridview有一个编辑和删除按钮。

我点击编辑,我得到,“ddlAssignedTo' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value

我知道我收到此错误,因为值ddlAssignedTo为null - ddlAssignedTo的数据库中不存在任何内容。

我所要做的就是更新当前值。

所以,我的问题是这个,如果当前值为null,我该如何为ddlAssignedTo分配一个默认值,这样如果db上当前没有值,默认值会占优势?

以下是一些代码:

标记:

<asp:TemplateField HeaderText="Assigned To">
    <EditItemTemplate>
      <asp:DropDownList ID="ddlAssignedTo" runat="server" 
                        DataSourceID="SubjectDataSource"
                        DataTextField="fullname" DataValueField="empl_Id"
                        SelectedValue='<%# Bind("AssignedTo") %>'>
        <asp:ListItem Value="">--Select Name--</asp:ListItem>
      </asp:DropDownList>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="lblAssigned" runat="server" 
                   Text='<% #Bind("fullname") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                   ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                   SelectCommand="SELECT Distinct [rownum],[reqnum], AssignedTo, (empl_first + ' ' + empl_last) fullname, [reqrecdate], [reqrecfrom], [skillsets], [application], [hoursperweek], [fromdate], [todate], [status], [statusupdate], [statusupby] FROM [requestinfo] left join employee on requestInfo.AssignedTo=employee.empl_id ORDER BY [reqnum]" 
                   UpdateCommand="INSERT INTO [requestinfo] ([reqnum], [reqrecdate], [reqrecfrom], [skillsets], [application], [hoursperweek], [fromdate], [todate], [status], [statusupdate], [statusupby],[AssignedTo]) VALUES (@reqnum, @reqrecdate, @reqrecfrom, @skillsets, @application, @hoursperweek, @fromdate, @todate, @status, @statusupdate, @statusupby,@empl_id)">
    <DeleteParameters>
        <asp:Parameter Name="rownum" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="reqnum" Type="String" />
        <asp:Parameter DbType="DateTime" Name="reqrecdate" />
        <asp:Parameter Name="reqrecfrom" Type="String" />
        <asp:Parameter Name="skillsets" Type="String" />
        <asp:Parameter Name="application" Type="String" />
        <asp:Parameter Name="hoursperweek" Type="Int32" />
        <asp:Parameter DbType="DateTime" Name="fromdate" />
        <asp:Parameter DbType="DateTime" Name="todate" />
        <asp:Parameter Name="status" Type="String" />
        <asp:Parameter DbType="DateTime" Name="statusupdate" />
        <asp:Parameter Name="statusupby" Type="String" />
        <asp:Parameter Name="empl_id" Type="String" />
        <asp:Parameter Name="rownum" Type="Int32" />
    </UpdateParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="SubjectDataSource" runat="server" 
                   ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
                   SelectCommand="SELECT empl_id,  (empl_first + ' ' + empl_last) fullname FROM dbo.Employee order by empl_last">
</asp:SqlDataSource>

代码隐藏:

Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) Handles GridView1.RowUpdating

    Dim dd As DropDownList = DirectCast(GridView1.Rows(e.RowIndex).FindControl("ddlstatus"), DropDownList)
    e.NewValues("status") = dd.SelectedItem.Text
    Dim ddAssigned As DropDownList = DirectCast(GridView1.Rows(e.RowIndex).FindControl("ddlAssignedTo"), DropDownList)

    If String.IsNullOrEmpty(ddAssigned.SelectedValue) Then
        ddAssigned.SelectedValue = "shhhh"
    Else
        e.NewValues("empl_id") = ddAssigned.SelectedValue
    End If

    SqlDataSource1.DataBind()
End Sub

4 个答案:

答案 0 :(得分:18)

在问题'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items

中查看@ cosmin.onea提供的解决方案

此解决方案在AppendDataBoundItems="true"上设置DropDownList并创建一个nullable ListItem,以便即使表中的字段为空,您的DropDownList也会绑定。

应用于OP的问题,以下代码段将提供在AssignedTo字段为空时选择的选项。

<asp:DropDownList ID="ddlAssignedTo" runat="server" 
    DataSourceID="SubjectDataSource" 
    DataTextField="fullname" DataValueField="empl_Id" 
    SelectedValue='<%# Bind("AssignedTo") %>' 
    AppendDataBoundItems="true">
        <asp:ListItem Text="Select" Value="" />
</asp:DropDownList>

答案 1 :(得分:1)

此解决方案在DropDownList上设置AppendDataBoundItems =“true”并创建一个可空的ListItem,这样即使表中的字段为空,DropDownList也会绑定。

应用于OP的问题,以下代码段将提供在AssignedTo字段为空时选择的选项。

<asp:DropDownList ID="ddlAssignedTo" runat="server" 
    DataSourceID="SubjectDataSource" 
    DataTextField="fullname" DataValueField="empl_Id" 
    SelectedValue='<%# Bind("AssignedTo") %>' 
    AppendDataBoundItems="true">
        <asp:ListItem Text="Select" Value="" />
</asp:DropDownList>

在此解决方案中,如果用户未选择有效项目,则在保存时可能会出现问题。 所以你也可以设置

<asp:ListItem Text="Select" Value="" />

启用= false 然后,当您打开一个新项目时,它将带来一个存在于数据库中的项目。

我有同样的问题,它解决了我。

答案 2 :(得分:0)

嗨,我检查同样的问题。我的麻烦是,数据字段的索引号。我正在使用像这个表[3]那样的数据字段索引号,在创建gridview之后,我改变了数据库表的顺序。

毕竟我使用了字段名称而不是字段索引号并解决了问题。

答案 3 :(得分:0)

您在命令SQL Server中出现问题,您必须在事件处于活动状态时选择id匹配,并且下拉列表的当前ID已被选中,然后问题已解决。

  1. 再次查看包含两个表的键,以便查询。

  2. Bin(&#34; Name&#34;)必须与命令查询中的Name匹配。