我想在dataGridView中填写重复数据的数字。如果重复我将填写从1.1到1.(计数重复)否则不要复制我填写1.1。但我使用代码,因为它的工作不正常。
double
我希望每个人都能帮助我。
答案 0 :(得分:0)
如果为CSIS和BSS订购了列表,您只需要检查实际行之前的行以确定Wbs。
这里的技巧是在标记之前进行分组,然后只检查之前的那个。
我认为如果你在数据网格视图中处理它们之前使用poco对象可以更好地推理,这里有一些没有经过测试的代码,但是你可以在Rows和Cells上使用或多或少相同的代码。 / p>
class Data {
String Wbs { get; set; }
String Csis { get; set; }
String Bss { get; set; }
String CsisAndBss() => Csis + Bss;
}
var list = new Data { ... }; // objects
list.OrderBy( ... ); // Csis then Bss
for(int i = 0; i < list.Count; list++){
var actual = list[i];
var before = list[i-1]; // check list boundaries
if(i==0 || before.CsisAndBss != actual.CsisAndBss){
actual.Wbs == "1.1";
continue;
}
var values = before.Wbs.Split(".");
actual.Wbs = $"{values[0]}.{Int32.Parse(values[1]+1)}";
}
// here pass data to the grid
答案 1 :(得分:0)
您的代码存在一些问题。您没有在i循环中重新设置计数,并且(如果我理解正确的话),您只需要检查DataGridView中的先前值(即j
所以你的代码应该是这样的:
int count;
dataGridView3.Rows[0].Cells[1].Value = "1.1";
for (int i = 1; i <= dataGridView3.RowCount - 1; i++)
{
count = 1;
string abc = dataGridView3.Rows[i].Cells[2].Value.ToString() + "" + dataGridView3.Rows[i].Cells[3].Value.ToString();
for (int j = 0; j < i; j++)
{
string def = dataGridView3.Rows[j].Cells[2].Value.ToString() + "" + dataGridView3.Rows[j].Cells[3].Value.ToString();
if (abc == def)
{
count++;
}
}
dataGridView3.Rows[i].Cells["Wbs"].Value = "1." + count.ToString();
}
无论数据顺序如何,这都有效。如果数据是在CSIS和BSS上订购的,那么您可以使用:
int count = 1;
dataGridView3.Rows[0].Cells[1].Value = "1.1";
for (int i = 1; i <= dataGridView3.RowCount - 1; i++)
{
if (dataGridView3.Rows[i].Cells[2].Value == dataGridView3.Rows[i - 1].Cells[2].Value
&& dataGridView3.Rows[i].Cells[3].Value == dataGridView3.Rows[i - 1].Cells[3].Value)
{
count++;
}
else
{
count = 1;
}
dataGridView3.Rows[i].Cells["Wbs"].Value = "1." + count.ToString();
}
在这种情况下,因为我们只将一行与其前一行进行比较,所以不将变量存储在新变量中更有效,而是直接比较它们。存储到单独的变量只有速度增益,当您保存编译的代码时,需要多次取消引用相同的值。