2013-05-12 46 views
7

我加载gridview的列表中存在,在GridView中有一个编辑和删除按钮是无效的。如何解决“‘ddlAssignedTo’具有的SelectedValue,因为它不在项目

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

我知道我得到这个错误,因为值为ddlAssignedTo为空 - 在ddlAssignedTo的db上没有任何东西存在。

我只是想更新当前值。

所以,我的问题是这样的,如果当前值为空,我该如何为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 
+0

我不明白你为什么在代码中有'SelectedValue ='<%#绑定(“AssignedTo”)%>''。当你删除它会发生什么? – Emre 2013-05-12 13:13:55

+0

只要错误消失,并且修改成功,就可以工作。 唯一的问题是,如果我需要将AssignedTo的当前值替换为另一个值,那么当单击编辑时,我需要查看当前值。现在,它显示空白。尽管您可以从下拉列表中选择它,但在编辑模式下将其预选为预选会很好。 – Kenny 2013-05-12 19:51:48

+1

尝试在您的edittemplate中添加另一个标签以查看当前值'' – Emre 2013-05-12 20:25:32

回答

17

看看通过@ cosmin.onea的问题'DropDownList1' has a SelectedValue which is invalid because it does not exist in the list of items

提供的解决方案

此解决方案在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> 
0

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

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

0

您在命令SQL Server中的问题,您必须采用ID匹配与id当前的下拉列表已选择事件活动时,然后问题已解决。

  1. 再次查看包含两个表的关键所以你查询。

  2. Bin(“Name”)必须与命令查询中的Name匹配。

1

该解决方案将AppendDataBoundItems =“真”的DropDownList的,并创建一个为空的列表项,使您的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="" /> 

当你打开一个新的项目将带来的是存在于数据库中的项目启用=假 然后。

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

相关问题