7

グリッドビューをロードすると、グリッドビューには編集ボタンと削除ボタンがあります。

[編集] をクリックすると、"ddlAssignedTo' has a SelectedValue which is invalid because it does not exist in the list of items. Parameter name: value

値 foddlAssignedToが null であるため、このエラーが発生していることはわかっています。ddlAssignedTo のデータベースには何も存在しません。

私がやろうとしていたのは、現在の値を更新することだけです。

したがって、私の問題はこれです。現在の値がnullの場合、dbに現在値が存在しない場合にデフォルト値が優先されるように、ddlAssignedToにデフォルト値を割り当てるにはどうすればよいですか?

ここにいくつかのコードがあります:

マークアップ:

<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

4 に答える 4

1

このソリューションは、DropDownList に AppendDataBoundItems="true" を設定し、テーブルのフィールドが null の場合でも DropDownList がバインドされるように、1 つの null 許容 ListItem を作成します。

OP の問題に適用すると、次のスニペットは、AssignedTo フィールドが null の場合に選択されるオプションを提供します。

<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="" />

as Enabled = false 次に、新しいアイテムを開くと、データベースに存在するアイテムが表示されます。

私は同じ問題を抱えていて、それは私に解決しました。

于 2015-07-28T19:01:07.220 に答える
0

コマンドSQL Serverの問題。イベントがアクティブなときにドロップダウンリストの現在のIDと一致するIDを取得する必要があり、問題は解決しました。

  1. 2 つのテーブルのキーが含まれているので、もう一度参照してください。

  2. Bin("Name") は、コマンド クエリの Name と一致する必要があります。

于 2014-04-13T02:27:45.810 に答える