为啥Datagridview的最后一行不能排序?
Posted
技术标签:
【中文标题】为啥Datagridview的最后一行不能排序?【英文标题】:Why last row of Datagridview can't sort?为什么Datagridview的最后一行不能排序? 【发布时间】:2022-01-12 08:51:14 【问题描述】:这是我的代码:
string ColumnName_Idx="Idx";
表单加载:
DataGridViewCheckBoxColumn col1 = new System.Windows.Forms.DataGridViewCheckBoxColumn();
col1.DataPropertyName = "FLAG";
col1.Name = "FLAG";
col1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic;
DGV_List.Columns.Add(col1);
DGV_List.Columns.Add(ColumnName_Idx, ColumnName_Idx);
DGV_List.Columns[ColumnName_Idx].Visible = true;
DGV_List.Columns[ColumnName_Idx].DataPropertyName =ColumnName_Idx ;
DGV_List.Columns[ColumnName_Idx].SortMode = DataGridViewColumnSortMode.Programmatic ;
DataTable oData = new DataTable();
oData.Columns.Add("FLAG", typeof(bool));
oData.Columns.Add("FLAG_BASE", typeof(bool));
oData.Columns.Add("FLAG_SELECT", typeof(bool));
oData.Columns.Add("GROUP_NAME");
oData.Columns.Add("TOOL_NAME");
oData.Columns.Add("MODEL_TRIAL_NO");
oData.Columns.Add(ColumnName_Idx, typeof(int));
for (int i = 1; i <= 5; i++)
DataRow dr = oData.NewRow();
if(i==1)
dr["FLAG"] = true ;
else
dr["FLAG"] = false;
dr["FLAG_BASE"] = false;
dr["FLAG_SELECT"] = false;
dr["MODEL_TRIAL_NO"] = "test" + i;
oData.Rows.Add(dr);
DGV_List.DataSource = oData;
DGV_List.Sort(this.DGV_List.Columns["FLAG"], ListSortDirection.Ascending);
事件单元格点击:
private void DGV_List_CellClick(object sender, DataGridViewCellEventArgs e)
this.DGV_List.BeginEdit(true);
for (int i = 0; i < DGV_List.Rows.Count; i++)
DGV_List.Rows[i].Cells[ColumnName_Idx].Value = i+1;
this.DGV_List.EndEdit();
DGV_List.Sort(this.DGV_List.Columns[ColumnName_Idx], ListSortDirection.Ascending);
当我点击复选框列时,DatagridView 的最后一行无法正确排序。
结果:
这是预期结果:
为什么Datagridview的最后一行不能排序?
【问题讨论】:
【参考方案1】:关于您在这里尝试做什么有很多问题。因此,直截了当……我相信您描述的问题来自这样一个事实,即代码将值添加到“网格单元”而不是将值添加到网格DataSource
单元格。
请记住,IF
和 DataGridView
有 DataSource
...THEN
... 从技术上讲,您可以通过以下两种方式之一对网格进行排序... 1) 您可以将“GRID”排序为当前代码确实......或者...... 2)您可以通过对网格“DATASOURCE”进行排序来对网格进行排序。显然,如果将两者混合使用,您可能会得到不希望的结果。
首先并且可能最相关的方面是IF
您对“GRID”进行排序,就像您的代码当前所做的那样……THEN
……在排序之后……网格行和网格中的底层DataRows
@987654329 @ 不一定是相同的顺序。如果您过滤 GRID,同样的想法也适用。在几乎所有情况下,当您对 GRID 进行排序时,底层数据源都保持不变。
很不清楚“为什么”你会将排序代码放在网格中CellClick
事件...? ……有了这个,每次用户点击一个单元格,然后网格被重新排序……? … 这很奇怪,而且在 99% 的单元格点击中显然是不必要的,因为网格已经排序。
为了提供一个简单的解决方案,我建议……当代码设置“idx”数字时……而不是循环遍历 GRID 行并设置每个单元格……而是循环遍历网格 DataSource
行并设置单元格与网格单元相反。下面的代码似乎可以按照您的意愿行事……但这又不清楚。
private void DGV_List_CellClick(object sender, DataGridViewCellEventArgs e)
DataTable gridTable = (DataTable)DGV_List.DataSource;
for (int i = 0; i < gridTable.Rows.Count; i++)
gridTable.Rows[i][ColumnName_Idx] = i + 1;
DGV_List.Sort(this.DGV_List.Columns[ColumnName_Idx], ListSortDirection.Ascending);
如果这不是您要寻找的……那么……请编辑您的问题以阐明您要完成的工作。最后,毫无疑问,您应该从CellClick
事件的网格中删除排序。
【讨论】:
我必须保持Datagridview的顺序,如果改变数据源是不正确的。 我想在编辑 CellValue 时关闭排序(单击标题时仍然允许排序)。所以我添加了一个 tmp 列来保持目标行的索引。 “我必须保持 Datagridview 的顺序,如果更改数据源,则不正确。” ...我的代码在哪里“更改”数据源顺序? “我想在编辑 CellValue 时关闭排序(单击标题时仍然允许排序)。” ...然后在设置值之前“取消排序”网格。代码在表单加载事件结束时对网格进行排序。您可以关闭表单加载事件中完成的排序,也可以使用我的解决方案……两者都会产生相同的结果。再一次……不清楚你在这里想要什么。你能举个例子吗? 在加载事件中:我按“FLAG”排序,我想在编辑时保持这个顺序。以上是关于为啥Datagridview的最后一行不能排序?的主要内容,如果未能解决你的问题,请参考以下文章
c# winform datagridview第一行单元格不能调整高度~~
怎么让datagridview默认选中一行,系统默认的是选中第一行的第一个单元格。谢谢
数据库 C# datagridview可不可以让某一列禁止被更改