0

したがってGridView、貸出情報を表示する があり、テーブルには、、などLoansの ID があります。LaptopUserLocation

に表示するときはGridView、ID 番号の代わりに名前を使用します。

私の問題は、以下のように edititemtemplate にドロップダウンリストを配置すると、テーブルが更新されず、適切な情報でローン テーブルを更新できるようにしたいという次のエラーが表示されることです。

値 NULL を列 'Laptop_ID'、テーブル 'itassetmgmt.dbo.Loans' に挿入できません。列はヌルを許可しません。更新は失敗します。ステートメントは終了されました。

Loans テーブルには以下が含まれます: Loan_ID Date_Loaned Date_Returned Sign_Off Laptop_ID User_ID Dept_ID Location_ID

ASPX:

<asp:TemplateField HeaderText="Laptop_Name" SortExpression="Laptop_Name">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList1" SelectedValue ='<%# Bind("Laptop_Name") %>' runat="server" DataSourceID="editLPID" DataTextField="Laptop_Name" DataValueField="Laptop_Name">
                </asp:DropDownList>
                <asp:SqlDataSource ID="editLPID" runat="server" ConnectionString="<%$ ConnectionStrings:itassetmgmtConnectionString1 %>" SelectCommand="SELECT [Laptop_ID], [Laptop_Name] FROM [Laptops]"></asp:SqlDataSource>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Laptop_Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Name" SortExpression="Name">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList2" runat="server" SelectedValue='<%# Bind("Name") %>' DataSourceID="editUID" DataTextField="Name" DataValueField="Name">
                </asp:DropDownList>
                <asp:SqlDataSource ID="editUID" runat="server" ConnectionString="<%$ ConnectionStrings:itassetmgmtConnectionString1 %>" SelectCommand="SELECT User_ID, Firstname +' '+ Lastname AS Name FROM Users"></asp:SqlDataSource>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label2" runat="server" Text='<%# Bind("Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Department" SortExpression="Department">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList3" runat="server" SelectedValue='<%# Bind("Department") %>' DataSourceID="editDID" DataTextField="Department" DataValueField="Department">
                </asp:DropDownList>
                <asp:SqlDataSource ID="editDID" runat="server" ConnectionString="<%$ ConnectionStrings:itassetmgmtConnectionString1 %>" SelectCommand="SELECT * FROM [Departments]"></asp:SqlDataSource>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label3" runat="server" Text='<%# Bind("Department") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Location_Name" SortExpression="Location_Name">
            <EditItemTemplate>
                <asp:DropDownList ID="DropDownList4" runat="server" SelectedValue='<%# Bind("Location_Name") %>' DataSourceID="editLID" DataTextField="Location_Name" DataValueField="Location_Name">
                </asp:DropDownList>
                <asp:SqlDataSource ID="editLID" runat="server" ConnectionString="<%$ ConnectionStrings:itassetmgmtConnectionString1 %>" SelectCommand="SELECT * FROM [Locations]"></asp:SqlDataSource>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label4" runat="server" Text='<%# Bind("Location_Name") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

編集: おそらく、DropDownList の DataValueField がテーブル内の対応する ID# に設定されていないことが原因であることはわかっていますが、DataValueField を変更すると、一連のエラーが発生します。助言がありますか?

私の更新コマンド:UpdateCommand="UPDATE [Loans] SET [Date_Loaned] = @Date_Loaned, [Date_Returned] = @Date_Returned, [Sign_Off] = @Sign_Off, [Laptop_ID] = @Laptop_ID, [User_ID] = @User_ID, [Dept_ID] = @Dept_ID, [Location_ID] = @Location_ID WHERE [Loan_ID] = @original_Loan_ID"

4

2 に答える 2

1

Gridview で、グリッドの表示可能な部分からすべての ID を取り出します。それらを表示する必要はありませんが、それらに対してバインドするには、gridview データソースの一部である必要があります

次にItemTemplate(ユーザー テンプレートのみを表示しています) DataTextFieldDataValueFieldDropDownList データソースから取得しますが、プロパティは Gridview User_ID に対してバインドされますSelectedValue

<asp:TemplateField>
  <ItemTemplate>
    <asp:DropDownList ID="DropDownList2Disabled" runat="server" DataSourceID="SqlDataSource3"
      Enabled="False" 
      DataTextField="Name" 
      DataValueField="User_ID" 
      SelectedValue='<%# Eval("User_ID") %>'>
    </asp:DropDownList>
  </ItemTemplate>
  <EditItemTemplate>
    <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3"
      DataTextField="Name" 
      DataValueField="User_ID" 
      SelectedValue='<%# Bind("User_ID") %>'>
    </asp:DropDownList>
  </EditItemTemplate>
</asp:TemplateField>

と の両方で DDL を使用してItemTemplateおりEditItemTemplate、一方を無効にし、もう一方を有効にしています。必要に応じて項目テーブルでラベルを使用できますが、ユーザー名はグリッドビューの一部ではないため、もう少し作業が必要になります。

gridview sql を制御でき、ユーザー名をデータセットに追加できる場合 (UserName など)、ItemTemplate ラベルを UserName にバインドし、EditItemTemplate DropDownList を User_ID にバインドできます。

編集: 拡張例:

したがって、ラベルのアイデアを使用すると、テンプレートは次のようになります。

<asp:TemplateField>
  <ItemTemplate>
    <asp:Label ID="LabelUserName" runat="server" Text='<%# Eval("UserName") %>'>
    </asp:Label>
  </ItemTemplate>
  <EditItemTemplate>
    <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3"
      DataTextField="Name" 
      DataValueField="User_ID" 
      SelectedValue='<%# Bind("User_ID") %>'>
    </asp:DropDownList>
  </EditItemTemplate>
</asp:TemplateField>

そして、Gridview DataSource Select (または Stored Proc) は、次のようになります (または含まれます)。

Select Loan_ID 
    ,  l.Date_Loaned 
    ,  l.Date_Returned 
    ,  l.Sign_Off 
    ,  l.Laptop_ID 
    ,  l.User_ID 
    ,  u.FirstName + ' ' + u.LastName as UserName 
    ,  l.Dept_ID
    ,  d.DepartmentName
    ,  l.Location_ID
    ,  (etc...)
    From LoansTable l
        Left Join UserTable u on u.User_ID = l.User_ID
        Left Join DeptTable d on d.Dept_ID = l.Dept_ID
        (etc.)
    Order By d.DepartmentName
        ,    l.Date_Loaned

したがって、これは、Gridview に十分なユーザー フレンドリ データを提供してきれいな表示を提供するフィールドセットと、ユーザーが Gridview を操作するときにプログラマーが変更を加える必要がある可能性がある ID を返します。

ID を DataKeyNames プロパティに追加することで、ID を GridView に追加できる場合と追加できない場合があります。これにより、GridView ポストバック中にコード ビハインドの ID に簡単にアクセスできます。ここに配置されたキーは、GridView の表示可能な部分の一部ではありません

EditItemTemplate の DDL には独自の DataSource があり、単純な Select があります。

Select User_ID, FirstName + ' ' + LastName as Name From UserTable

2 つの異なるデータソースからの重複するフィールドを混同しないでください。EditItemTemplate の DDL 宣言:

<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3"
    DataTextField="Name" 
    DataValueField="User_ID" 
    SelectedValue='<%# Bind("User_ID") %>'>
</asp:DropDownList>

DataValueField="User_ID"GridView DataSource のフィールドSelectedValue='<%# Bind("User_ID") %>'へのバインディングであるのに対し、DDL DataSource を参照します。User_ID

ここで、GridviewUser_IDフィールドはユーザーから「非表示」になっていますが、編集目的で Gridview で使用でき、配置した場合はプログラムで条件付きで使用できます。DataKeyNames

于 2015-04-10T22:00:40.907 に答える
0

Gridview の OnRowDataBound イベントを使用できます。

    protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {   
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
             if(e.Row.RowState == DataControlRowState.Edit)
             {
                  DropDownList DropDownList1 = e.Row.FindControl("DropDownList1") as DropDownList1;

                  Label Laptop_Name = e.Row.FindControl("Laptop_Name") as Label;

                //one option
                DropDownList1.SelectedValue = Laptop_Name.Text;
                //however for this option to work, when dropdownlist1 is binded data, its DataValueField should be set to "Laptop_Name"

                //second option with foreach
                foreach(ListItem item in DropDownList1.Items)
                {
                   if(item.Text == Laptop_Name.Text)
                       item.Selected = true; //not sure if the syntax is correct
                }
             }         
         }
    }

DropDownList1 の定義を次のように変更する必要があります。

  <asp:DropDownList ID="DropDownList1" SelectedValue ='<%# Bind("Laptop_Id") %>' runat="server" DataSourceID="editLPID" DataTextField="Laptop_Name" DataValueField="Laptop_Id">
于 2015-04-10T18:10:05.117 に答える