C# 计算每个id以及每个期间、月份和年份的行数

C# 计算每个id以及每个期间、月份和年份的行数,c#,sql-server,datagridview,C#,Sql Server,Datagridview,我想显示一个DataGridView,其中包含Compte名称以及每月和每年的Recette和Depense的总和。 我有一个一年一个月定制的DateTimePicker 示例:如果我选择日期=2015年11月(2015年11月),它将显示如下 Compte Total BTK 633,000 Biat 987,888 Caisse 988,875 Compte Total BTK 0 Biat 653,256 Caisse 88,145 如果

我想显示一个DataGridView,其中包含Compte名称以及每月和每年的Recette和Depense的总和。 我有一个一年一个月定制的DateTimePicker

示例:如果我选择日期=2015年11月(2015年11月),它将显示如下

Compte  Total   
BTK     633,000
Biat    987,888
Caisse  988,875
Compte  Total   
BTK     0
Biat    653,256
Caisse  88,145
如果我选择日期=2016年6月(2016年6月),它将显示如下

Compte  Total   
BTK     633,000
Biat    987,888
Caisse  988,875
Compte  Total   
BTK     0
Biat    653,256
Caisse  88,145
我的代码:

public partial class ComptesMois : Form
{
    SqlConnection conn;
    SqlCommand comm;
    SqlDataReader dreader;
    string connstring = "Data Source=.;Initial Catalog=Tresorerie;Integrated Security=True";
    public ComptesMois()
    {
        InitializeComponent();
        //Set Columns Count
        DataGridViewCompteMois.ColumnCount = 2;

        //Hide the last blank line
        DataGridViewCompteMois.AllowUserToAddRows = false;

        //Add Columns
        DataGridViewCompteMois.Columns[0].Name = "NomCom";
        DataGridViewCompteMois.Columns[0].HeaderText = "Nom de Compte";
        DataGridViewCompteMois.Columns[0].DataPropertyName = "NomCom";
        DataGridViewCompteMois.Columns[0].Width = 100;

        //Add Columns
        DataGridViewCompteMois.Columns[1].Name = "Total";
        DataGridViewCompteMois.Columns[1].HeaderText = "Total";
        DataGridViewCompteMois.Columns[1].DataPropertyName = "Total";
        DataGridViewCompteMois.Columns[1].Width = 100;

        this.BindGrid();

        CompteMoisdateTimePicker.Format = DateTimePickerFormat.Custom;
        CompteMoisdateTimePicker.CustomFormat = "MM yyyy";
        //CompteMoisdateTimePicker.ShowUpDown = true; // to prevent the calendar from being displayed

    }

    private void BindGrid()
    {

        DataGridViewCompteMois.DataSource = null;
        using (SqlConnection con = new SqlConnection(connstring))
        {
            using (SqlCommand cmd = new SqlCommand("select DISTINCT c.NomCom from Tresorerie t join Compte c on t.IdCom=c.IdCom", con))
            {
                cmd.CommandType = CommandType.Text;
                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        DataGridViewCompteMois.DataSource = dt;
                    }
                }
            }
        }
    }


    private void DataGridViewCompteMois_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        string month = CompteMoisdateTimePicker.Value.Month.ToString();
        string year = CompteMoisdateTimePicker.Value.Year.ToString();
        //select * from < table > where month(searchDate) = Month_from_box and Year(searchDate) = Year_from_box
        // select sum(recette + depence) from Tresorerie where 
        String total;

        for (int i = 0; i < DataGridViewCompteMois.Rows.Count; i++)
        {
            conn = new SqlConnection(connstring);
            conn.Open();
            String NomCompteDataGrid = Convert.ToString(DataGridViewCompteMois.Rows[i].Cells[0].Value);
            String IdCompteValue = "select IdCom from Compte where NomCom='" + NomCompteDataGrid + "'";
            comm = new SqlCommand(IdCompteValue, conn);
            int IdComValue = Convert.ToInt32(comm.ExecuteScalar());
            conn.Close();

            using (SqlConnection con = new SqlConnection(connstring))
            {
                using (SqlCommand cmd = new SqlCommand("select sum(Recette + Depense) as Total from Tresorerie where IdCom=@IdCom GROUP BY Recette,Depense", con))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@IdCom", IdComValue);
                    con.Open();
                    total = Convert.ToString(cmd.ExecuteNonQuery());
                    con.Close();
                }
            }
            DataGridViewCompteMois.Rows[i].Cells[1].Value = total;
        }
    }
}
公共部分类ComptesMois:表单
{
SqlConnection-conn;
SqlCommand;
SqlDataReader恐惧者;
string connstring=“数据源=;初始目录=目录;集成安全性=真”;
公共公司()
{
初始化组件();
//设置列数
DataGridViewCompteMois.ColumnCount=2;
//隐藏最后一个空行
DataGridViewCompteMois.AllowUserToAddress=false;
//添加列
DataGridViewCompteMois.Columns[0]。Name=“NomCom”;
DataGridViewCompteMois.Columns[0]。HeaderText=“Nom de Compte”;
DataGridViewCompteMois.Columns[0].DataPropertyName=“NomCom”;
DataGridViewCompteMois.Columns[0]。宽度=100;
//添加列
DataGridViewCompteMois.Columns[1].Name=“Total”;
DataGridViewCompteMois.Columns[1].HeaderText=“Total”;
DataGridViewCompteMois.Columns[1].DataPropertyName=“Total”;
DataGridViewCompteMois.Columns[1]。宽度=100;
这个.BindGrid();
CompteMoisdateTimePicker.Format=DateTimePickPerformat.Custom;
CompteMoisdateTimePicker.CustomFormat=“MM yyyy”;
//CompteMoisdateTimePicker.ShowUpDown=true;//防止显示日历
}
私有void BindGrid()
{
DataGridViewCompteMois.DataSource=null;
使用(SqlConnection con=newsqlconnection(connstring))
{
使用(SqlCommand cmd=newsqlcommand(“从树中选择DISTINCT c.NomCom t在t.IdCom=c.IdCom上加入Compte c”,con))
{
cmd.CommandType=CommandType.Text;
使用(SqlDataAdapter sda=newsqldataadapter(cmd))
{
使用(DataTable dt=newdatatable())
{
sda.填充(dt);
DataGridViewCompteMois.DataSource=dt;
}
}
}
}
}
私有void DataGridViewCompteMois_CellContentClick(对象发送者,DataGridViewCellEventArgs e)
{
字符串month=CompteMoisdateTimePicker.Value.month.ToString();
字符串year=CompteMoisdateTimePicker.Value.year.ToString();
//选择*from其中月(searchDate)=月(from)和年(searchDate)=年(from)
//从Tresorerie中选择sum(接收+依赖),其中
字符串总数;
对于(int i=0;i
但是有一个错误,结果显示每个Compte为-1

更新1:多亏了@Soner_Gönül,我修改了查询语句,并在sql上测试了它,它工作了,但当我将结果添加到网格单元格时,问题显示为空,但我尝试用messgae box显示它,它工作了,我的代码:

 String total;
    private void CompteMoisdateTimePicker_ValueChanged(object sender, EventArgs e)
    {
        string month = CompteMoisdateTimePicker.Value.Month.ToString();
        string year = CompteMoisdateTimePicker.Value.Year.ToString();


        for (int i = 0; i < DataGridViewCompteMois.Rows.Count; i++)
        {
            conn = new SqlConnection(connstring);
            conn.Open();
            String NomCompteDataGrid = Convert.ToString(DataGridViewCompteMois.Rows[i].Cells[0].Value);
            String IdCompteValue = "select IdCom from Compte where NomCom='" + NomCompteDataGrid + "'";
            comm = new SqlCommand(IdCompteValue, conn);
            int IdComValue = Convert.ToInt32(comm.ExecuteScalar());
            conn.Close();

            using (SqlConnection con = new SqlConnection(connstring))
            {
                using (SqlCommand cmd = new SqlCommand("select SUM( Depense + Recette ) from Tresorerie where IdCom=@IdCom and MONTH(DateTre) = @MONTH AND YEAR(DateTre) = @YEAR GROUP BY IdCom", con))
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Parameters.AddWithValue("@IdCom", IdComValue);
                    cmd.Parameters.AddWithValue("@MONTH", month);
                    cmd.Parameters.AddWithValue("@YEAR", year);
                    con.Open();
                    total = Convert.ToString(cmd.ExecuteScalar());
                    con.Close();
                }
            }
            DataGridViewCompteMois.Rows[i].Cells["Total"].Value = total;
            //MessageBox.Show(total.ToString());
        }
    }
字符串总数;
私有void CompteMoisdateTimePicker_值已更改(对象发送方,事件参数e)
{
字符串month=CompteMoisdateTimePicker.Value.month.ToString();
字符串year=CompteMoisdateTimePicker.Value.year.ToString();
对于(int i=0;i
更新解决方案:看,我有一个问题,选择哪个单元格,这个cod