gpt4 book ai didi

c# - Gridview 为什么所有可见行都设置为脏?

转载 作者:太空狗 更新时间:2023-10-29 23:26:19 25 4
gpt4 key购买 nike

我正在使用所讨论的 BulkEditGridView 控件 http://roohit.com/site/showArc.php?shid=bbb62 ,它非常适合我的需求。我遇到的问题是,每当我保存时,每个可见行(我启用了分页)都会更新。单步执行代码时,我看到 grid.DirtyRows.Count 等于单击保存按钮时每页的项目数减 1。

我找不到行设置为脏行的位置。我可以在哪里查看任何建议?

我的代码隐藏只有这个:

using System;
using System.Web.UI.WebControls;
using System.Collections.Generic;
using System.Collections;
using System.Data.Common;

public partial class MSDS_MSDS_Admin_GridUpdate : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
gridMSDS.DataKeyNames = new String[] { "id" };
gridMSDS.DataBind();
}
}
}

编辑:这是 aspx 代码。

<%@ Page Language="C#" MasterPageFile="~/MSDS/MSDS.master" AutoEventWireup="true" EnableEventValidation="false" CodeFile="GridUpdate.aspx.cs" Inherits="MSDS_MSDS_Admin_GridUpdate" Title="Untitled Page" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<%@ Register Assembly="RealWorld.Grids" Namespace="RealWorld.Grids" TagPrefix="cc2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="PageContent" runat="Server">
<br />
<asp:Button ID="btnSave" runat="server" Text="Save" Width="100%" />
<cc2:BulkEditGridView ID="gridMSDS" runat="server" AllowPaging="True" AllowSorting="True"
DataSourceID="sqlData" EnableInsert="False" InsertRowCount="1" PageSize="20"
SaveButtonID="btnSave" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" Visible="false"
ReadOnly="True" SortExpression="ID" />
<asp:BoundField DataField="ChemicalTitle" HeaderText="ChemicalTitle" SortExpression="ChemicalTitle" />
<asp:TemplateField HeaderText="SheetDate" SortExpression="SheetDate">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("SheetDate") %>' Width="85px"></asp:TextBox>
<cc1:CalendarExtender ID="TextBox1_CalendarExtender" runat="server" Enabled="True"
TargetControlID="TextBox1">
</cc1:CalendarExtender>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("SheetDate") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Filename" HeaderText="Filename" SortExpression="Filename" />
<asp:BoundField DataField="Manufacturer" HeaderText="Manufacturer" SortExpression="Manufacturer" />
<asp:BoundField DataField="UsageDept" HeaderText="UsageDept" SortExpression="UsageDept" />
<asp:TemplateField HeaderText="Notes" SortExpression="Notes">
<EditItemTemplate>
<asp:TextBox ID="TextBox5" runat="server" Text='<%# Bind("Notes") %>' TextMode="MultiLine"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label6" runat="server" Text='<%# Bind("Notes") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Status" SortExpression="Status">
<EditItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server" DataSourceID="sqlStatus" DataTextField="DisplayValue"
DataValueField="Value" SelectedValue='<%# Bind("Status") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="sqlStatus" runat="server" ConnectionString="<%$ ConnectionStrings:NCLWebConnectionString %>"
SelectCommand="getOptionList" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="msds_Status" Name="ListName" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</EditItemTemplate>
<ItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server" DataSourceID="sqlStatus" disabled="true"
BackColor="White" DataTextField="DisplayValue" DataValueField="Value" SelectedValue='<%# Bind("Status") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="sqlStatus" runat="server" ConnectionString="<%$ ConnectionStrings:NCLWebConnectionString %>"
SelectCommand="getOptionList" SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:Parameter DefaultValue="msds_Status" Name="ListName" Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Health" SortExpression="Health">
<EditItemTemplate>
<center>
<asp:TextBox ID="TextBox2" runat="server" Style="text-align: center" Text='<%# Bind("Health") %>'
Width="25px"></asp:TextBox>
</center>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Health") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Fire" SortExpression="Fire">
<EditItemTemplate>
<center>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Fire") %>' Width="25px"></asp:TextBox></center>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("Fire") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Reactivity" SortExpression="Reactivity">
<EditItemTemplate>
<center>
<asp:TextBox ID="TextBox4" runat="server" Text='<%# Bind("Reactivity") %>' Width="25px"></asp:TextBox></center>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("Reactivity") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="DateUpdated" HeaderText="DateUpdated" SortExpression="DateUpdated"
ReadOnly="True" />
<asp:BoundField DataField="UpdatedBy" ReadOnly="True" HeaderText="UpdatedBy" SortExpression="UpdatedBy" />
</Columns>
</cc2:BulkEditGridView>
<asp:SqlDataSource ID="sqlData" runat="server" ConnectionString="<%$ ConnectionStrings:NCLWebConnectionString %>"
SelectCommand="SELECT [ID], [ChemicalTitle], dbo.dateOnly([SheetDate]) As [SheetDate], [Filename], [Manufacturer], [UsageDept], [Notes], isnull([Status], 4) as [Status], [Health], [Fire], [Reactivity], [DateUpdated], [UpdatedBy] FROM [msds_Sheets] ORDER BY [ChemicalTitle]"
UpdateCommand="msds_UpdateSheet" UpdateCommandType="StoredProcedure">
<UpdateParameters>
<asp:Parameter Name="ID" Type="Int32" />
<asp:Parameter Name="ChemicalTitle" Type="String" />
<asp:Parameter Name="SheetDate" DbType="DateTime" />
<asp:Parameter Name="Filename" Type="String" />
<asp:Parameter Name="Manufacturer" Type="String" />
<asp:Parameter Name="UsageDept" Type="String" />
<asp:Parameter Name="Notes" Type="String" />
<asp:Parameter Name="Status" Type="Int16" />
<asp:Parameter Name="Health" Type="Int16" />
<asp:Parameter Name="Fire" Type="Int16" />
<asp:Parameter Name="Reactivity" Type="Int16" />
<asp:ProfileParameter Name="UpdatedBy" Type="String" PropertyName="Username" />
</UpdateParameters>
</asp:SqlDataSource>
</asp:Content>

测试程序如下:
-加载页面。
-编辑第一行的内容。
- 单击保存按钮。

最佳答案

您发布的代码看起来不错。我的测试代码与您的几乎相同,但我无法产生您所看到的不需要的结果。

你的代码和我的代码之间最显着的区别是我没有你的母版页的代码。我的母版页是由 VS 2008 创建的默认页面。除此之外,差异在于 SQL 和底层数据库。具体来说,我没有使用任何存储过程,并且我对涉及的数据类型做出了合理的假设:IDintStatussmallintSheetDateDateDateUpdatedDateTime,其他都是varchar

编辑:您的SheetDate 似乎只是数据库中基础DateTime 值的日期部分。您的查询出于显示目的转换基础数据值这一事实无关紧要,因为 GridView 无法判断它正在获取修改后的值。 编辑结束

这里有一些诊断问题的建议:

  • 在没有母版页的情况下进行测试,或者使用非常简单的虚拟母版页保证没有脚本与 BulkEditGridView 交互。由于 ToolkitScriptManager 是显然在你的母版页上,你会需要移动脚本管理器控制页面本身,或者暂时摆脱CalendarExtender 元素,其中需要脚本管理器。

  • 临时替换状态具有绑定(bind)数据的模板字段领域,以消除的可能性与 DropDownList 的交互。下拉列表没有导致我的测试中出现问题,但可能是你之间的细微差别代码和我的。

  • 如果这些都没有帮助,那么可能的原因是您的问题BulkEditGridView 的版本。

编辑 - 其他诊断建议:

  • 根据对 BulkEditGridView 源代码的检查,代码似乎正确地跟踪了网格的哪些行是“脏的”。因此,虚假脏行的最可能原因是网格中的一个或多个控件错误地检测到对其数据内容的更改。您可以在调试器中检测到这一点,使用 BulkEditGridView 的源代码,而不是预编译的 DLL。

  • HandleRowChanged 的开头设置一个断点,该事件处理程序检测网格的任何单元格中的更改。通过在调试器中检查该对象的 sender 参数,您可以知道网格中的哪些控件正在发生值更改。特别是,您将能够判断哪些控件(如果有)错误地触发了值更改事件。

  • 一旦您确定哪些控件错误地报告了它们的值已更改,您就可以关注发生这种情况的原因

编辑结束

其他一些改进代码的建议如下。 这些不会解决原来的问题,但会让代码更干净:

  • 在所有模板字段中,删除 ItemTemplate。它们永远无法使用,因为 BulkEditGridView 强制每一行都处于编辑状态。

  • 在后面的代码中,BindData()不需要调用,因为源数据在声明中指定标记,因此 GridView 控件会自动绑定(bind)数据。

关于c# - Gridview 为什么所有可见行都设置为脏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5836937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com