2013-05-12 47 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="" /> 

當你打開一個新的項目將帶來的是存在於數據庫中的項目啓用=假 然後。

我有同樣的問題,它解決了我。

相關問題