将行号列添加到绑定到 DataTable 的 DataGridView

     2023-04-09     156

关键词:

【中文标题】将行号列添加到绑定到 DataTable 的 DataGridView【英文标题】:Add row number column to DataGridView bound to DataTable 【发布时间】:2020-03-13 06:41:33 【问题描述】:

在 ADO.NET 中,我使用 DataAdapter.Fill (..) 调用来使用数据库中的值填充 DataTable。然后我将 DataTable 绑定到 DataGrid 以允许滚动浏览所有值、编辑并将更改更新回数据库。所有标准的东西。我对所有这些都使用 Visual Studio Windows 窗体向导,因为它非常标准。

但现在我想显示一个左侧列(不是数据库行的一部分)来对 DataGrid 中显示的行进行编号。我仍然希望将绑定的行数据保持原样,并自动更新回数据库等等。显然,我不能用向导来做到这一点。

方法一

如果我手动执行此操作,我会更改 DataTable 加载查询以包含一个虚拟整数列,以将所需的行号列注入返回的表中:

SELECT ‘’ as Num, * from MyTable

然后我会在将 DataTable 绑定到网格之前以编程方式将行号插入该字段,这将根据需要显示行号。我希望 DataTable 的自动更新代码会忽略网格中的额外列。

方法2

另一种可能的方法是在绑定到 DataSource(我的 DataTable)后以编程方式将新列添加到 DataGrid。然后我会在显示网格之前用行号填充新列。

问题

但在我放弃方便的向导并为所有事情做手动工作之前,我想问一下是否有一种标准的方法来做这种事情。我不敢相信我是第一个想要在网格显示中使用行号(不是数据库行的一部分)的人。

我已经在这里和其他各种论坛上搜索过想法,但没有人谈论当您将新列注入表加载查询(方法 1)或绑定 DataGrid 后的网格中时更新代码会发生什么到数据源(方法 2)。

我什至想过使用从两个不同绑定源馈送的两个相邻网格控件。但是在滚动期间保持它们同步所需的代码似乎需要更多的工作。

谁能指出解决此问题的最佳方法或提供代码 sn-p 吗?我可以进入表单设计器生成的代码以将列添加到绑定的 DataGrid,但我在尝试查找和理解将更改更新回数据库的更新部分时迷失了方向。谢谢。

【问题讨论】:

您可能可以根据实际数据库(您没有说)使用 SQL 将行号添加到数据库查询结果中。如果您可以在数据表中有未绑定的列。您可以添加这样的列并将结果填充到行绘制事件中。这样,您就不会为保持两个不同的事物同步而头疼。请注意,如果是WinForms,则几乎可以肯定是DataGridView 而不是DataGrid。使用关键字Datagridview row number c# 仅在该网站上就有 61,000 次点击 感谢您的帮助。抱歉,我没有说我正在使用 MS Access 和 Windows DataGridViews 以及 Infragistics UltraGrid(但我的问题更笼统)。是的,我痛苦地意识到各种搜索表达式在互联网上的大量点击。我确定我已经调查了 100 多个。是的,我知道我可以将未绑定的列添加到网格中,但对我来说,关键问题是这样做是否会仅影响绑定列上的数据库更新。 我很确定 MS Access 不支持行号,但这并不妨碍您通过 SQL SELECT 语句添加列并更新 PrePaint 事件中的值。基本的 DB Provider 对象当然足够聪明,即使您手动添加它也不会被人工列混淆。您所要做的就是尝试看看“巫师”是否犹豫 见:DataGridViewRow.HeaderCell Property 感谢最近的海报!你们中的一个人断言,数据更新对象不会被不属于基础 DataTable 的其他列混淆。你们中的一个人指出,我可以通过设置 HeaderCell.Value 文本在网格本身中显示行号。我的问题的两个很好的答案。 【参考方案1】:

有一些不错的选择,它们不会干扰数据的查询或结构,并且仅基于 GUI 逻辑:

使用RowPostPaint事件在RowHeader上绘制行号 使用RowPrePaint事件将行号分配给行的HeaderCell 创建一个新的DataGridViewRowNumberColumn 以显示行号

使用 RowPostPaint 事件在 RowHeader 上绘制行号

您可以处理RowPostPaint 并在标题单元格中绘制行号。以下代码显示了一个简单的逻辑:

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)

    var g = (DataGridView)sender;
    var r = new Rectangle(e.RowBounds.Left, e.RowBounds.Top,
        g.RowHeadersWidth, e.RowBounds.Height);
    TextRenderer.DrawText(e.Graphics, $"e.RowIndex + 1",
        g.RowHeadersDefaultCellStyle.Font, r, g.RowHeadersDefaultCellStyle.ForeColor);

上面的代码已经足够好了,但是您可能希望通过将 datagridview 单元格对齐映射到 this 方法等文本格式标志来增强逻辑。您可能还希望将逻辑放在自定义 DataGridView 中并覆盖 OnRowPostPaint 并在派生的 DataGridViewtrue 时设置 DoubleBuffered 属性。

使用 RowPrePaint 事件将行号分配给行的HeaderCell 如果将字符串值分配给标题单元格的Value 属性,它将显示在行标题上。

您在循环中分配值,在这种情况下,您需要处理 RowAddedRowRemoved 事件并重新分配行号。更好的解决方案是使用RowPrePaint 并检查标题单元格的值是否不正确,然后更正它:

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)

    var g = (DataGridView)sender;
    if (e.RowIndex > -1 && $"g.Rows[e.RowIndex].HeaderCell.Value" != $"e.RowIndex + 1")
    
        g.Rows[e.RowIndex].HeaderCell.Value = $"e.RowIndex + 1";
    

创建一个新的DataGridViewRowNumberColumn 以显示行号

第二个选项是创建一个新的可重用列类型来显示行号。您可以像使用任何其他列类型一样使用此列类型。您可以在设计时或运行时添加列。

using System.ComponentModel;
using System.Windows.Forms;
public class DataGridViewRowNumberColumn : DataGridViewColumn

    public DataGridViewRowNumberColumn() : base()
    
        this.CellTemplate = new DataGridViewRowNumberCell();
        this.Width = 40;
        this.SortMode = DataGridViewColumnSortMode.NotSortable;
    
    [Browsable(false)]
    [DefaultValue(true)]
    public override bool ReadOnly
    
        get  return true; 
        set  base.ReadOnly = true; 
    

public class DataGridViewRowNumberCell : DataGridViewTextBoxCell

    protected override void Paint(System.Drawing.Graphics graphics,
        System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds,
        int rowIndex, DataGridViewElementStates cellState, object value,
        object formattedValue, string errorText, DataGridViewCellStyle cellStyle,
        DataGridViewAdvancedBorderStyle advancedBorderStyle,
        DataGridViewPaintParts paintParts)
    
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
            formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
    
    protected override object GetValue(int rowIndex)
    
        return rowIndex + 1;
    
    protected override bool SetValue(int rowIndex, object value)
    
        return base.SetValue(rowIndex, rowIndex + 1);
    

【讨论】:

哇,多么棒的答案! (还有代码 sn-ps。)你显然是这方面的大师。谢谢! - 凯文【参考方案2】:

见:DataGridViewRow.HeaderCell Property – TnTinMn

TnTinMn 提供了最简单的答案,可以实现我的目标。我在这里复制了他的评论,以便将其标记为已回答的问题。

加载网格后,只需沿着行向下走并将行标签(行号)分配给行左端的“标题单元格”。好的部分是行号是网格中的一个标签,而不是网格中的一列未绑定数据。

【讨论】:

如果用户可以添加或删除行,那么您需要处理添加行和删除行事件并将新的行号分配给标题单元格。

以编程方式将新列添加到 DataGridView(填充有 DataTable 的 DataGridview)

】以编程方式将新列添加到DataGridView(填充有DataTable的DataGridview)【英文标题】:AddnewcolumnprogrammaticallytoDataGridView(DataGridviewFilledwithDataTable)【发布时间】:2020-10-1523:07:53【问题描述】:我已将datagridview与access数据库表绑定。我想... 查看详情

C# 将 DataTable 绑定到现有 DataGridView 列定义

】C#将DataTable绑定到现有DataGridView列定义【英文标题】:C#BindDataTabletoExistingDataGridViewColumnDefinitions【发布时间】:2011-02-1304:09:09【问题描述】:我一直在与NullReferenceException作斗争,希望这里有人能够为我指明正确的方向。我正在... 查看详情

更改绑定到 DataGridView 的 DataTable 中的列顺序不会反映在视图中

】更改绑定到DataGridView的DataTable中的列顺序不会反映在视图中【英文标题】:ChangingcolumnorderinDataTableboundtoDataGridViewdoesnotreflectintheview【发布时间】:2010-10-0416:49:05【问题描述】:当应用程序运行时,DataGridView绑定到DataTable。后来... 查看详情

将行号列添加到 jquery 数据表

】将行号列添加到jquery数据表【英文标题】:Addrownumbercolumntojquerydatatables【发布时间】:2011-10-1519:38:38【问题描述】:我希望jQuery数据表能够像VB中的datagrid一样在第一列中自动创建行号列。看起来像这样:有人知道怎么做吗?... 查看详情

将行号列添加到 IList<T>

】将行号列添加到IList<T>【英文标题】:AddRowNumbercolumntoIList<T>【发布时间】:2020-04-0302:27:56【问题描述】:我正在尝试将DataSet转换为IList&lt;myDataModel&gt;并在尝试填充行号列时卡住了。这是我转换数据的方法:privat... 查看详情

如何将新的 DataRow 添加到 DataTable 中?

】如何将新的DataRow添加到DataTable中?【英文标题】:HowtoaddnewDataRowintoDataTable?【发布时间】:2012-09-2814:32:17【问题描述】:我有一个DataGridView绑定到一个DataTable(DataTable绑定到数据库)。我需要将DataRow添加到DataTable。我正在尝... 查看详情

如何将行号添加到剑道 ui 网格?

】如何将行号添加到剑道ui网格?【英文标题】:Howtoaddrownumbertokendouigrid?【发布时间】:2013-06-2700:47:29【问题描述】:我的页面中有一个剑道ui网格,它有一些列。现在我想添加一列来显示我的行号。我该怎么做?谢谢。【问题... 查看详情

使用 SqlBulkCopy 将 DataTable 中的列映射到 SQL 表

】使用SqlBulkCopy将DataTable中的列映射到SQL表【英文标题】:MappingcolumnsinaDataTabletoaSQLtablewithSqlBulkCopy【发布时间】:2013-07-0209:41:28【问题描述】:我想知道在将数据添加到数据库之前如何将数据库表中的列映射到c#中的数据表。usin... 查看详情

如何将 DataTable 绑定到 Datagrid

】如何将DataTable绑定到Datagrid【英文标题】:HowtobindDataTabletoDatagrid【发布时间】:2014-01-1306:14:02【问题描述】:我在将DataTable绑定到DataGrid时遇到问题。我已经寻找解决方案,但无法摆脱错误。绑定在使用WindowsForms时工作正常,... 查看详情

无法刷新绑定到 DataTable 的 DataGridView

】无法刷新绑定到DataTable的DataGridView【英文标题】:UnabletorefreshDataGridViewthatisboundtoaDataTable【发布时间】:2019-04-1122:58:50【问题描述】:我已经使用论坛上的其他答案尝试了所有方法。我只是希望我的数据网格视图在进行更改后... 查看详情

将 DataGrid 绑定到两个 DataTable

】将DataGrid绑定到两个DataTable【英文标题】:BindingDataGridtotwoDataTable【发布时间】:2015-12-1408:31:56【问题描述】:我有两个DataTable,它们的结构、架构和约束完全相同,但行不同。我需要将这些表显示为DataGrid,并连接在一起,即... 查看详情

如何将 DataTable 绑定到 DataGrid

】如何将DataTable绑定到DataGrid【英文标题】:HowBindDataTabletoDataGrid【发布时间】:2011-10-1202:24:39【问题描述】:这是我的数据表。DataTable_simpleDataTable=newataTable();varperson=newDataColumn("Person")DataType=typeof(Person);_simpleDataTable.Columns.A 查看详情

将值添加到特定的 DataTable 单元格

】将值添加到特定的DataTable单元格【英文标题】:AddingvaluestospecificDataTablecells【发布时间】:2012-09-0602:44:44【问题描述】:我想知道是否可以向特定的DataTable单元格添加值?假设我有一个现有的dataTable并且我添加了一个新列,我... 查看详情

将 DataTable 绑定到 RDLC 和 ReportViewer

】将DataTable绑定到RDLC和ReportViewer【英文标题】:BindDataTabletoRDLCandReportViewer【发布时间】:2014-03-0723:49:06【问题描述】:我已经阅读了所有关于此的SO问题和在线文章,但我在几个不同的情况下感到困惑。在我的项目中,我尝试... 查看详情

如何将 DataTable.Select() 的结果绑定到 ListBox 控件?

】如何将DataTable.Select()的结果绑定到ListBox控件?【英文标题】:HowdoIbindtheresultofDataTable.Select()toaListBoxcontrol?【发布时间】:2010-09-1200:09:08【问题描述】:我有以下代码:ListBox.DataSource=DataSet.Tables("table_name").Select("some_criteria=match")... 查看详情

如何将 DataTable 绑定到由 DatagridViewTextBoxColumn 和 DataGridViewComboBoxColumn 组成的 DataGridView?

】如何将DataTable绑定到由DatagridViewTextBoxColumn和DataGridViewComboBoxColumn组成的DataGridView?【英文标题】:HowtobindDataTabletoDataGridViewthatconsistsofaDatagridViewTextBoxColumnandaDataGridViewComboBoxColumn?【发布时间】:2014-01-2807:48:01 查看详情

在更新到数据库之前编辑 DataTable 中的行

】在更新到数据库之前编辑DataTable中的行【英文标题】:EditRowinDataTablebeforeUpdatetoDatabase【发布时间】:2014-05-3001:18:54【问题描述】:情况是这样的:我有一个链接到TableAdapter的DataGridView。由于Table的某些列对DataGridView隐藏,因此... 查看详情

如何在已经绑定数据源的datagridview添加一行数据并保存到数据库??

网上有人说可以加一行这个就好((DataTable)dataGridView1.DataSource).Rows.Add("row");可是调试结果显示无法将类型为“System.Windows.Forms.BindingSource”的对象强制转换为类型“System.Data.DataTable”。求大神帮忙给出详细解答(本人完全菜... 查看详情