根据c #windows中另一列的值,在datagrid中汇总列值

时间:2013-11-08 08:07:12

标签: c# windows datagrid

我有一个包含许多列的数据网格。 以下是其中两列。 我需要单独将P / F列的P和F值的计数值相加并比较它们。对于P,总和为3,对于F,它是7.我需要显示具有更大值的总和。有什么方法可以实现dis。

P/F | Count
------------------------
P   | 2
P   | 1
F   | 5
F   | 2

使用Linq

 var p_sum = from p_col in dataGridView1  //-->  am getting error here(group by not found)
  group p_col  by p_col.Status into g 
  select g.Sum(p => p.weightagepercent) ; 

3 个答案:

答案 0 :(得分:0)

您可以使用linq执行以下操作:

var p_sum = 
    from p_col in datagrid
    group p_col  by p_col.datagrid_p_f_column into g 
    select g.Sum(p => p.datagrid_value_column) }; 

为F执行相同的操作,然后在两个变量上显示更大的更小,更大或更大


首先学习linq。它会让你的生活更轻松:)这是官方101 linq samples

我们假设我有一个名为ExtraStringDataPoint的类,定义如下:

public class ExtraStringDataPoint : IDataPoint
{
    public ExtraStringDataPoint(double x, double y , string s)
    {
        X = x;
        Y = y;
        Extra = s;
    }
    public double X { get; set; }
    public double Y { get; set; }
    public string  Extra { get; set; }
}

现在我收集了这些要点:

List<ExtraStringDataPoint> MyList = new List<ExtraStringDataPoint>()
{
    new ExtraStringDataPoint(10,10,"ten"),
    new ExtraStringDataPoint(20, 20, "twenty"),
    new ExtraStringDataPoint(30,30, "thirty")
};

您可以使用linq对Y的所有点的值求和,其中X值大于15,例如:

var bigger_than_15 = from point in MyList
                      where point.X > 15
                      select point;

var total_y = bigger_than_15.Sum(point => point.Y);

所以,回到你的情况。 Linq会根据您的数据网格将项目的名称(P或F)保存到一个组中。 p_col是临时变量,datagrid_p_f_column应该是列名(或对象中的属性,它是相同的)。分组完成后,它将汇总所有值。对于每个p的情况,它将总和p.datagrid_value_column,它应该是包含数字值的列的名称。最后,p_sum将包含名称为p的行的值的总和。冲洗并重复f。比较,就是这样。

答案 1 :(得分:0)

int countF=0;
int countP=0;

foreach(DataRow row in DataTable.rows)
{
    if(row.itemArray[0].tostring().equals("F")
            {
                countf++;
            }
            `if(row.itemArray[0].tostring().equals("P")`
            {
                countP++;
            }
        }
        if(countF>countP)
{
    Display
}
else

Display

// for dataGrid View

dataGridView1.Rows.Add("P","1");
        dataGridView1.Rows.Add("F","2");
        int countF = 0;
        int countP = 0;
        for (int i = 0; i < dataGridView1.Rows.Count-1; i++)
        {
           string a= dataGridView1[0, i].Value.ToString();
           string b = dataGridView1[1, i].Value.ToString();
           if (a == "F")
           {
               countF= Convert.ToInt32(b);
               countF++;
           }
           if (a == "P")
           {
               countF = Convert.ToInt32(b);
               countP++;
           }
            }
        if (countF > countP)
        {
            //display
        }
        else
        {
            //display
        }

答案 2 :(得分:0)

我不使用Linq 下面是一个简单的工作代码

double sumP = 0;
double sumF = 0;

for (int i = 6; i < dataGridView1.Rows.Count-1; ++i)
{
    if (dataGridView1.Rows[i].Cells[6].Value.Equals("P"))
    {
        sumP += Convert.ToDouble(dataGridView1.Rows[i].Cells[9].Value);
    }
    else if (dataGridView1.Rows[i].Cells[6].Value.Equals("F"))
    {
        sumF += Convert.ToDouble(dataGridView1.Rows[i].Cells[9].Value);
    }
}

If(sumF>sumP)
{
    Label2.text="Fail";
}
else
{
    label2.text="Pass";
}