1

我有一个网格视图。在这个我有一个带有 DropDownList 的模板字段(在 EditItemTemplate 模式下的 DDL,在 ItemTemplate 模式下的标签)。当我点击详细信息视图行的编辑时,我可以从 DDL 中选择任何值(DDL 是从 sqldatasource 填充的),但是如果我尝试执行更新,它会失败,因为它认为我没有提供数据...

这是确切的错误(数据库拒绝 NULL 数据):

无法将值 NULL 插入到列 'status'、表 'gyumolcs.dbo.orders' 中;列不允许空值。更新失败。该语句已终止。

这是gridview的代码:

<!-- language: c# -->
<asp:SqlDataSource ID="orderadminSqlDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:dotnetConnectionString %>" 
    SelectCommand="SELECT orders.ID, aspnet_Users.UserName, orders.quantity AS Quantity, product.name AS Product, status.name AS Status, orders.date AS Date FROM orders INNER JOIN product ON orders.ordertype = product.ID INNER JOIN status ON orders.status = status.ID INNER JOIN aspnet_Users ON orders.userid = aspnet_Users.UserId ORDER BY date" 
    DeleteCommand="DELETE FROM orders WHERE (ID = @ID)" 
    UpdateCommand="UPDATE orders SET status = @status WHERE (ID = @ID)">
    <DeleteParameters>
        <asp:Parameter Name="ID" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="status" />
        <asp:Parameter Name="ID" />
    </UpdateParameters>
</asp:SqlDataSource><asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataSourceID="orderadminSqlDataSource" DataKeyNames="ID" Width="608px" 
        AllowPaging="True" AllowSorting="True" PageSize="15">
        <Columns>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
            <asp:BoundField DataField="ID" HeaderText="ID" 
                SortExpression="ID" InsertVisible="False" ReadOnly="True" >
            <ItemStyle HorizontalAlign="Right" />
            </asp:BoundField>
            <asp:BoundField DataField="UserName" HeaderText="Felhasználónév" 
                SortExpression="UserName" >
            <HeaderStyle HorizontalAlign="Center" />
            <ItemStyle HorizontalAlign="Center" />
            </asp:BoundField>
            <asp:BoundField DataField="Quantity" HeaderText="Mennyiség (kg)" 
                SortExpression="Quantity" >
            <HeaderStyle HorizontalAlign="Center" />
            <ItemStyle HorizontalAlign="Center" />
            </asp:BoundField>
            <asp:BoundField DataField="Product" HeaderText="Termék" 
                SortExpression="Product" >
            <HeaderStyle HorizontalAlign="Center" />
            <ItemStyle HorizontalAlign="Center" />
            </asp:BoundField>
            <asp:TemplateField HeaderText="Rendelés státusz" SortExpression="status">
                <EditItemTemplate>
                    <!--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Status") %>'></asp:TextBox>-->

                    <asp:DropDownList ID="DropDownList1" runat="server" 
                        DataSourceID="statustypeDDLSqlDataSource" DataTextField="name"
                        DataValueField="ID">
                    </asp:DropDownList>
                    <asp:SqlDataSource ID="statustypeDDLSqlDataSource" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:dotnetConnectionString %>" 
                        SelectCommand="SELECT [ID], [name] FROM [status]">
                    </asp:SqlDataSource>

                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="status" runat="server" Text='<%# Bind("Status") %>'></asp:Label>
                </ItemTemplate>
                <HeaderStyle HorizontalAlign="Center" />
                <ItemStyle HorizontalAlign="Center" />
            </asp:TemplateField>
            <asp:BoundField DataField="Date" HeaderText="Dátum" SortExpression="Date" />
        </Columns>
        <PagerSettings PageButtonCount="15" Mode="NumericFirstLast" />
    </asp:GridView>

这是 orderadminSqlDataSource 的代码(gridview 的数据源)

<!-- language: c# -->
    <asp:SqlDataSource ID="orderadminSqlDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:dotnetConnectionString %>" 
        SelectCommand="SELECT orders.ID, aspnet_Users.UserName, orders.quantity AS Quantity, product.name AS Product, status.name AS Status, orders.date AS Date FROM orders INNER JOIN product ON orders.ordertype = product.ID INNER JOIN status ON orders.status = status.ID INNER JOIN aspnet_Users ON orders.userid = aspnet_Users.UserId ORDER BY date" 
        DeleteCommand="DELETE FROM orders WHERE (ID = @ID)" 
        UpdateCommand="UPDATE orders SET status = @status WHERE (ID = @ID)">
        <DeleteParameters>
            <asp:Parameter Name="ID" />
        </DeleteParameters>
        <UpdateParameters>
            <asp:Parameter Name="status" />
            <asp:Parameter Name="ID" />
        </UpdateParameters>
    </asp:SqlDataSource>

请帮助我,我无法弄清楚问题所在。提前致谢!

4

1 回答 1

1

我认为您忘记设置 DropDown 的SelectedValue属性:

<asp:DropDownList ID="DropDownList1"
                  runat="server" 
                  DataSourceID="statustypeDDLSqlDataSource"
                  DataTextField="name"
                  DataValueField="status"
                  SelectedValue='<%# Bind("status") %>'
                  AppendDataBoundItems="True" >

更改您的代码statustypeDDLSqlDataSource

<asp:SqlDataSource ID="statustypeDDLSqlDataSource" runat="server" 
                   ConnectionString="<%$ ConnectionStrings:dotnetConnectionString %>" 
                   SelectCommand="SELECT [ID] as status, [name] FROM [status]">
</asp:SqlDataSource>

你也可以简化这个(不需要括号):

UPDATE orders SET [status] = @status WHERE [ID] = @ID

注意:我必须重命名查询中的 ID 列,使其符合status您在此处定义的参数:

<UpdateParameters>
    <asp:Parameter Name="status" />
    <asp:Parameter Name="ID" />
</UpdateParameters>

我在这里的最后一次编辑和尝试:D

仔细查看您的 GridView 的SELECT声明后,我看到了错误所在:

SELECT orders.ID,
       aspnet_Users.UserName,
       orders.quantity AS Quantity,
       product.name AS Product,
       status.name AS Status,
       orders.date AS Date
FROM orders
INNER JOIN product ON
orders.ordertype = product.ID
INNER JOIN status ON orders.status = status.ID
INNER JOIN aspnet_Users ON orders.userid = aspnet_Users.UserId
ORDER BY date

将其更改为:

SELECT orders.ID,
       aspnet_Users.UserName,
       orders.quantity AS Quantity,
       product.name AS Product,
       status.ID AS status,
       status.name AS StatusName,
       orders.date AS Date
FROM orders
INNER JOIN product ON
orders.ordertype = product.ID
INNER JOIN status ON orders.status = status.ID
INNER JOIN aspnet_Users ON orders.userid = aspnet_Users.UserId
ORDER BY date

现在您也必须更改这部分:

<ItemTemplate>
<asp:Label ID="status" runat="server" Text='<%# Bind("StatusName") %>'></asp:Label>
</ItemTemplate>

顺便说一句......这是关于这个问题的一个很好的分步教程:

演练:在 GridView Web 服务器控件中进行编辑时显示下拉列表

于 2012-07-10T20:56:17.833 回答