如何从 c# 中的 datagridview 中删除重复行?
How to remove duplicate row from datagridview in c#?
这是我的数据网格
我尝试了以下代码来删除 datagridview 中的重复行
public static DataTable items = new DataTable();
items.Columns.Add("Backsn");
items.Columns.Add("Oprn Name");
for (int i = 0; i < dataGridView1.Rows.Count;i++ )
{
DataRow rw = items.NewRow();
rw[0] = dataGridView1.Rows[i].Cells[2].Value.ToString();
rw[1] = dataGridView1.Rows[i].Cells[8].Value.ToString();
items.Rows.Add(rw);
}
dataGridView2.DataSource = items;
for (int i = 0; i < dataGridView2.Rows.Count; i++)
{
int k = 0;
for (int j = 0; j < dataGridView2.Rows.Count; j++)
{
if (dataGridView2.Rows[i].Cells[0].Value == dataGridView2.Rows[j].Cells[0].Value && dataGridView2.Rows[i].Cells[1].Value == dataGridView2.Rows[j].Cells[1].Value)
{
if (k != 0)
{
items.Rows.RemoveAt(j);
dataGridView2.DataSource = items;
}
k= k+1;
}
}
}
但运气不好。我应该得到像 below.Please 帮助我解决的结果。
如果你的情况用下面的代码替换
if (dataGridView2.Rows[i].Cells["Backsn"].Value == dataGridView2.Rows[j].Cells["Backsn"].Value && dataGridView2.Rows[i].Cells["Opm Name"]].Value == dataGridView2.Rows[j].Cells["Opm Name"].Value)`
{
如果您的 DataGrid 正在显示绑定到任何类型的数据源的数据,您应该尝试在绑定数据之前消除数据源中的重复项。
例如,如果您的 items
是任何一种 class T
的集合,您可以让 class 实现 IEquatable<T>
并重新定义您的数据源作为集合中的 IEnumerable<T>.Distinct()
值,或者将您的集合源转换为 HashSet<T>
.
如果您绑定到某种数据库查询结果或table,您可以将绑定转换为消除重复行的视图。
如果它与DataTable 绑定,您不需要在datagridview 中进行更改,尽管如此,您应该申请删除dataTable itlsef 中的重复行。你可以尝试一种方法-
DataTable items = new DataTable();
items.Columns.Add("Backsn");
items.Columns.Add("Oprn Name");
for (int i = 0; i < dataGridView1.Rows.Count;i++ )
{
DataRow rw = items.NewRow();
rw[0] = dataGridView1.Rows[i].Cells[2].Value.ToString();
rw[1] = dataGridView1.Rows[i].Cells[8].Value.ToString();
if (!items.Rows.Cast<DataRow>().Any(row => row["Backsn"].Equals(rw["Backsn"]) && row["Oprn Name"].Equals(rw["Oprn Name"])))
items.Rows.Add(rw);
}
int RowSpan = 2;
for (int i = grdGroup.Rows.Count - 2; i >= 0; i--)
{
GridViewRow currRow = grdGroup.Rows[i];
GridViewRow prevRow = grdGroup.Rows[i + 1];
if (currRow.Cells[0].Text == prevRow.Cells[0].Text)
{
currRow.Cells[0].RowSpan = RowSpan;
prevRow.Cells[0].Visible = false;
RowSpan += 1;
}
else
{
RowSpan = 2;
}
}
for another column in same grid
for (int i = grdGroup.Rows.Count - 2; i >= 0; i--)
{
GridViewRow currRow = grdGroup.Rows[i];
GridViewRow prevRow = grdGroup.Rows[i + 1];
if ((currRow.Cells[2].Text == prevRow.Cells[2].Text) && (currRow.Cells[0].Text == prevRow.Cells[0].Text))
{
currRow.Cells[2].RowSpan = RowSpan;
prevRow.Cells[2].Visible = false;
RowSpan += 1;
}
else
{
RowSpan = 2;
}
}
这是我的数据网格
我尝试了以下代码来删除 datagridview 中的重复行
public static DataTable items = new DataTable();
items.Columns.Add("Backsn");
items.Columns.Add("Oprn Name");
for (int i = 0; i < dataGridView1.Rows.Count;i++ )
{
DataRow rw = items.NewRow();
rw[0] = dataGridView1.Rows[i].Cells[2].Value.ToString();
rw[1] = dataGridView1.Rows[i].Cells[8].Value.ToString();
items.Rows.Add(rw);
}
dataGridView2.DataSource = items;
for (int i = 0; i < dataGridView2.Rows.Count; i++)
{
int k = 0;
for (int j = 0; j < dataGridView2.Rows.Count; j++)
{
if (dataGridView2.Rows[i].Cells[0].Value == dataGridView2.Rows[j].Cells[0].Value && dataGridView2.Rows[i].Cells[1].Value == dataGridView2.Rows[j].Cells[1].Value)
{
if (k != 0)
{
items.Rows.RemoveAt(j);
dataGridView2.DataSource = items;
}
k= k+1;
}
}
}
但运气不好。我应该得到像 below.Please 帮助我解决的结果。
如果你的情况用下面的代码替换
if (dataGridView2.Rows[i].Cells["Backsn"].Value == dataGridView2.Rows[j].Cells["Backsn"].Value && dataGridView2.Rows[i].Cells["Opm Name"]].Value == dataGridView2.Rows[j].Cells["Opm Name"].Value)`
{
如果您的 DataGrid 正在显示绑定到任何类型的数据源的数据,您应该尝试在绑定数据之前消除数据源中的重复项。
例如,如果您的 items
是任何一种 class T
的集合,您可以让 class 实现 IEquatable<T>
并重新定义您的数据源作为集合中的 IEnumerable<T>.Distinct()
值,或者将您的集合源转换为 HashSet<T>
.
如果您绑定到某种数据库查询结果或table,您可以将绑定转换为消除重复行的视图。
如果它与DataTable 绑定,您不需要在datagridview 中进行更改,尽管如此,您应该申请删除dataTable itlsef 中的重复行。你可以尝试一种方法-
DataTable items = new DataTable();
items.Columns.Add("Backsn");
items.Columns.Add("Oprn Name");
for (int i = 0; i < dataGridView1.Rows.Count;i++ )
{
DataRow rw = items.NewRow();
rw[0] = dataGridView1.Rows[i].Cells[2].Value.ToString();
rw[1] = dataGridView1.Rows[i].Cells[8].Value.ToString();
if (!items.Rows.Cast<DataRow>().Any(row => row["Backsn"].Equals(rw["Backsn"]) && row["Oprn Name"].Equals(rw["Oprn Name"])))
items.Rows.Add(rw);
}
int RowSpan = 2;
for (int i = grdGroup.Rows.Count - 2; i >= 0; i--)
{
GridViewRow currRow = grdGroup.Rows[i];
GridViewRow prevRow = grdGroup.Rows[i + 1];
if (currRow.Cells[0].Text == prevRow.Cells[0].Text)
{
currRow.Cells[0].RowSpan = RowSpan;
prevRow.Cells[0].Visible = false;
RowSpan += 1;
}
else
{
RowSpan = 2;
}
}
for another column in same grid
for (int i = grdGroup.Rows.Count - 2; i >= 0; i--)
{
GridViewRow currRow = grdGroup.Rows[i];
GridViewRow prevRow = grdGroup.Rows[i + 1];
if ((currRow.Cells[2].Text == prevRow.Cells[2].Text) && (currRow.Cells[0].Text == prevRow.Cells[0].Text))
{
currRow.Cells[2].RowSpan = RowSpan;
prevRow.Cells[2].Visible = false;
RowSpan += 1;
}
else
{
RowSpan = 2;
}
}