【问题标题】:When Gridview column is hidden, and update button is clicked, it tries to insert null value for that hidden field当 Gridview 列被隐藏并单击更新按钮时,它会尝试为该隐藏字段插入空值
【发布时间】:2012-09-29 20:41:48
【问题描述】:

问题与此处指出的类似:http://forums.asp.net/t/945656.aspx/1

我有一个带有更新按钮的 gridview 来更新行。

当一列被隐藏时,它会尝试将空值插入数据库并使用空值更新当前数据。我不希望这样,我想保持当前数据不变。

下面是我的sqldatasource

<asp:SqlDataSource ID="sds_OrderDetail" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConn %>"

    DeleteCommand="DELETE FROM [OrderDetail] WHERE [RowNo] = @RowNo" InsertCommand="INSERT INTO [OrderDetail] ([Id], [PONumber], [MaterialCode], [MaterialDescription], [MaterialCategory], [UnitOfMeasure], [Quantity], [ContainerId], [LoadingDate], [CutOffDate], [TransporterName], [BookingNo]) VALUES (@Id, @PONumber, @MaterialCode, @MaterialDescription, @MaterialCategory, @UnitOfMeasure, @Quantity, @ContainerId, @LoadingDate, @CutOffDate, @TransporterName, @BookingNo)"

    SelectCommand="SELECT * FROM [OrderDetail] WHERE ([Id] = @Id)" UpdateCommand="UPDATE [OrderDetail] SET [Id] = @Id, [PONumber] = @PONumber, [MaterialCode] = @MaterialCode, [MaterialDescription] = @MaterialDescription, [MaterialCategory] = @MaterialCategory, [UnitOfMeasure] = @UnitOfMeasure, [Quantity] = @Quantity, [ContainerId] = @ContainerId, [LoadingDate] = @LoadingDate, [CutOffDate] = @CutOffDate, [TransporterName] = @TransporterName, [BookingNo] = @BookingNo WHERE [RowNo] = @RowNo"

    OnSelected="sds_OrderDetail_Selected">

    <DeleteParameters>

        <asp:Parameter Name="RowNo" Type="Int32" />

    </DeleteParameters>

    <InsertParameters>

        <asp:SessionParameter DefaultValue="-1" Name="Id" SessionField="Id" Type="Int32" />

        <asp:Parameter Name="PONumber" Type="String" />

        <asp:Parameter Name="MaterialCode" Type="String" />

        <asp:Parameter Name="MaterialDescription" Type="String" />

        <asp:Parameter Name="MaterialCategory" Type="String" />

        <asp:Parameter Name="UnitOfMeasure" Type="String" />

        <asp:Parameter Name="Quantity" Type="String" />

        <asp:Parameter Name="ContainerId" Type="String" />

        <asp:Parameter Name="LoadingDate" Type="String" />

        <asp:Parameter Name="CutOffDate" Type="String" />

        <asp:Parameter Name="TransporterName" Type="String" />

        <asp:Parameter Name="BookingNo" Type="String" />

    </InsertParameters>

    <SelectParameters>

        <asp:SessionParameter DefaultValue="-1" Name="Id" SessionField="Id" Type="Int32" />

    </SelectParameters>

    <UpdateParameters>

        <asp:SessionParameter DefaultValue="-1" Name="Id" SessionField="Id" Type="Int32" />

        <asp:Parameter Name="PONumber" Type="String" />

        <asp:Parameter Name="MaterialCode" Type="String" />

        <asp:Parameter Name="MaterialDescription" Type="String" />

        <asp:Parameter Name="MaterialCategory" Type="String" />

        <asp:Parameter Name="UnitOfMeasure" Type="String" />

        <asp:Parameter Name="Quantity" Type="String" />

        <asp:Parameter Name="ContainerId" Type="String" />

        <asp:Parameter Name="LoadingDate" Type="String" />

        <asp:Parameter Name="CutOffDate" Type="String"  />

        <asp:Parameter Name="TransporterName" Type="String" />

        <asp:Parameter Name="BookingNo" Type="String" />

        <asp:Parameter Name="RowNo" Type="Int32" />

    </UpdateParameters>

</asp:SqlDataSource>

下面是我的 GridView

<cc1:BulkEditGridView ID="begv_OrderDetail" runat="server" AutoGenerateColumns="False"
    DataKeyNames="RowNo" DataSourceID="sds_OrderDetail" SaveButtonID="btn_SaveAll"
    BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
    CellPadding="3" OnRowCommand="begv_OrderDetail_RowCommand" OnRowUpdated="begv_OrderDetail_RowUpdated"
    OnRowDeleted="begv_OrderDetail_RowDeleted" OnRowCreated="begv_OrderDetail_RowCreated">
    <Columns>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="lbt_Update" runat="server" CausesValidation="false" CommandName="Update"
                    Text="Kaydet"></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="lbt_Copy" runat="server" CausesValidation="false" CommandName="Copy"
                    CommandArgument='<%# Container.DataItemIndex %>' Text="Kopyala" Visible='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField ShowHeader="False">
            <ItemTemplate>
                <asp:LinkButton ID="lbt_Delete" runat="server" CausesValidation="false" CommandName="Delete"
                    Text="Sil" Visible='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'></asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" ReadOnly="true" />
        <asp:TemplateField HeaderText="PONumber" SortExpression="PONumber">
            <EditItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("PONumber") %>' Enabled="false"
                    Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="MaterialCode" SortExpression="MaterialCode">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_MaterialCode" runat="server" DataSourceID="sds_MaterialCodes"
                    DataTextField="MaterialCode" DataValueField="MaterialCode" SelectedValue='<%# Bind("MaterialCode") %>'
                    OnSelectedIndexChanged="ddl_MaterialCode_SelectedIndexChanged" Width="100%" AppendDataBoundItems="true"
                    Enabled='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'>
                    <asp:ListItem Text="" Value=""></asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="MaterialDescription" SortExpression="MaterialDescription">
            <EditItemTemplate>
                <asp:TextBox ID="txt_MaterialDescription" runat="server" Text='<%# Bind("MaterialDescription") %>'
                    Enabled="false"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="MaterialCategory" SortExpression="MaterialCategory">
            <EditItemTemplate>
                <asp:TextBox ID="txt_MaterialCategory" runat="server" Text='<%# Bind("MaterialCategory") %>'
                    Enabled="false" Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="UnitOfMeasure" SortExpression="UnitOfMeasure">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_UnitOfMeasure" runat="server" DataSourceID="sds_UnitOfMeasure"
                    DataTextField="UnitOfMeasure" DataValueField="UnitOfMeasure" SelectedValue='<%# Bind("UnitOfMeasure") %>'
                    Width="94%" Enabled='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Quantity" SortExpression="Quantity">
            <EditItemTemplate>
                <asp:TextBox ID="txt_Quantity" runat="server" Text='<%# Bind("Quantity") %>' Width="94%"
                    Enabled='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ContainerId" SortExpression="ContainerId">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_ContainerId" runat="server" DataSourceID="sds_Containers"
                    DataTextField="ContainerId" DataValueField="ContainerId" SelectedValue='<%# Bind("ContainerId") %>'
                    Enabled='<%# Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2" %>'
                    Width="100%" AppendDataBoundItems="true">
                    <asp:ListItem Text="" Value=""></asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="FileNo" SortExpression="FileNo">
            <EditItemTemplate>
                <asp:TextBox ID="txt_FileNo" runat="server" Text='<%# Bind("FileNo") %>' Enabled="false"
                    Width="90%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="LoadingDate" SortExpression="LoadingDate">
            <EditItemTemplate>
                <asp:TextBox ID="txt_LoadingDate" runat="server" Text='<%# Bind("LoadingDate", "{0:yyyy-MM-dd}") %>'
                    Enabled='<%# Roles.IsUserInRole("İhracat Uzmanı") && Session["Status"].ToString()=="3" %>'
                    Width="94%"></asp:TextBox>
                <asp:CalendarExtender ID="ce_LoadingDate" runat="server" TargetControlID="txt_LoadingDate"
                    Format="yyyy-MM-dd">
                </asp:CalendarExtender>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="CutOffDate" SortExpression="CutOffDate">
            <EditItemTemplate>
                <asp:TextBox ID="txt_CutOffDate" runat="server" Text='<%# Bind("CutOffDate", "{0:yyyy-MM-dd}") %>'
                    Enabled='<%# Roles.IsUserInRole("İhracat Uzmanı") && Session["Status"].ToString()=="3" %>'
                    Width="94%"></asp:TextBox>
                <asp:CalendarExtender ID="ce_CutOffDate" runat="server" TargetControlID="txt_CutOffDate"
                    Format="yyyy-MM-dd">
                </asp:CalendarExtender>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="TransporterName" SortExpression="TransporterName">
            <EditItemTemplate>
                <asp:DropDownList ID="ddl_Transporters" runat="server" DataSourceID="sds_Transporters"
                    DataTextField="TransporterName" DataValueField="TransporterName" SelectedValue='<%# Bind("TransporterName") %>'
                    Width="94%" AppendDataBoundItems="true" Enabled='<%# (Roles.IsUserInRole("Planlamacı") && Session["Status"].ToString()=="1")||(Roles.IsUserInRole("Depocu") && Session["Status"].ToString()=="2") %>'>
                    <asp:ListItem Text="" Value=""></asp:ListItem>
                </asp:DropDownList>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="BookingNo" SortExpression="BookingNo">
            <EditItemTemplate>
                <asp:TextBox ID="txt_BookingNo" runat="server" Text='<%# Bind("BookingNo") %>' Enabled="false"
                    Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ContainerNo" SortExpression="ContainerNo">
            <EditItemTemplate>
                <asp:TextBox ID="txt_ContainerNo" runat="server" Text='<%# Bind("ContainerNo") %>'
                    Enabled="false" Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ReasonCode" SortExpression="ReasonCode">
            <EditItemTemplate>
                <asp:TextBox ID="txt_ReasonCode" runat="server" Text='<%# Bind("ReasonCode") %>'
                    Enabled="false" Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Comment" SortExpression="Comment">
            <EditItemTemplate>
                <asp:TextBox ID="txt_Comment" runat="server" Text='<%# Bind("Comment") %>' Enabled="false"
                    Width="94%"></asp:TextBox>
            </EditItemTemplate>
        </asp:TemplateField>
    </Columns>
    <FooterStyle BackColor="White" ForeColor="#000066" />
    <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
    <RowStyle ForeColor="#000066" />
    <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#007DBB" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#00547E" />
</cc1:BulkEditGridView>

我使用下面的解决方案来隐藏一列

https://stackoverflow.com/a/4954976/1235655

【问题讨论】:

  • 这个问题是关于一个GridView和一个Button;您可能希望同时显示两者的标记。执行隐藏操作的代码以及它所在的事件处理程序也会有所帮助。
  • 我没有在开始时添加它,因为实际上问题不是错误,而是默认的 gridview 行为。我相信,当一列不可见时,每个 gridview 的行为都是一样的。
  • 如果您在后面的代码中处理更新,而不是使用 SQLDataSource,这不会是一个问题。我不是网格的 SQLDataSource 的忠实粉丝,应该全部在后端绑定上完成。

标签: c# asp.net gridview sqldatasource


【解决方案1】:

将隐藏列值添加为 datakeyname 可以解决问题。

目前是

DataKeyNames="RowNo"

改成

DataKeyNames="RowNo,CutOffDate" 

解决了。

【讨论】:

    【解决方案2】:

    我过去曾通过对 UpdateCommand 中的每个隐藏列使用 IsNull() 来解决此问题

    例如

    如果 PONumber 是隐藏列,请使用 ISNULL(@PONumber,PONumber) 代替 @PONumber

    UpdateCommand="UPDATE [OrderDetail] SET [Id] = @Id, [PONumber] = @PONumber, [MaterialCode] = @MaterialCode, [MaterialDescription] = @MaterialDescription, [MaterialCategory] = @MaterialCategory, [UnitOfMeasure] = @UnitOfMeasure, [Quantity] = @Quantity, [ContainerId] = @ContainerId, [LoadingDate] = @LoadingDate, [CutOffDate] = @CutOffDate, [TransporterName] = @TransporterName, [BookingNo] = @BookingNo WHERE [RowNo] = @RowNo"
    

    PS,隐藏列值在更新时为 NULL 的原因是因为隐藏列意味着它不在 DOM 中或呈现。

    另一种方法是使用 CSS 类或样式(显示:无),以便仍然生成列,但请注意,您可能会在 HTML 中发送敏感信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多