none
空值赋值的问题 RRS feed

  • 问题

  • 又出现了一个问题,就是如果在数据库中是空值,偶想的只是当在数据库的值不存在时,将dataGridView的这一行的其它列数值设为0而己
    但是调试的时候却报错“确保不要出现无限循环”,求解
     
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                string connection = "server=192.100.3.3;database=AIS20090330165131;uid=sa;pwd=;";
                SqlConnection thisconection = new SqlConnection(connection);
                SqlCommand cmd = thisconection.CreateCommand();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "t_StoreAndSale";
                cmd.CommandTimeout = 0;
                SqlParameter myParameter = new SqlParameter("@FFullNumber", SqlDbType.VarChar, 40);
                myParameter.Direction = System.Data.ParameterDirection.Input;
                myParameter.Value = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString().Trim();
                cmd.Parameters.Add(myParameter);
                SqlDataAdapter Adapter = new SqlDataAdapter();
                Adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();
                Adapter.Fill(ds);
                //为什么加上这一段赋值的语句,会出现一个死循环,偶想的只是当在数据库的值不存在时,将dataGridView的这一行的其它列数值设为0而己
                if(ds.Tables[0].Rows.Count==0)
                {
                    dataGridView1.Rows[e.RowIndex].Cells[1].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[2].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[3].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[4].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[5].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[6].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[7].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[8].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[9].Value = 0;
                    dataGridView1.Rows[e.RowIndex].Cells[10].Value = 0;
                    return;
                 }
                else
                 {
                    dataGridView1.Rows[e.RowIndex].Cells[1].Value = ds.Tables[0].Rows[0]["当日实入"];
                    dataGridView1.Rows[e.RowIndex].Cells[2].Value = ds.Tables[0].Rows[0]["当月实入"];
                    dataGridView1.Rows[e.RowIndex].Cells[3].Value = ds.Tables[0].Rows[0]["当日出货"];
                    dataGridView1.Rows[e.RowIndex].Cells[4].Value = ds.Tables[0].Rows[0]["当月出货"];
                    dataGridView1.Rows[e.RowIndex].Cells[5].Value = ds.Tables[0].Rows[0]["包装成品库存"];
                    dataGridView1.Rows[e.RowIndex].Cells[6].Value = ds.Tables[0].Rows[0]["成品库存"];
                    dataGridView1.Rows[e.RowIndex].Cells[7].Value = ds.Tables[0].Rows[0]["半成品库存"];
                    dataGridView1.Rows[e.RowIndex].Cells[8].Value = ds.Tables[0].Rows[0]["包装投结存"];
                    dataGridView1.Rows[e.RowIndex].Cells[9].Value = ds.Tables[0].Rows[0]["装配结存"];
                    dataGridView1.Rows[e.RowIndex].Cells[10].Value = ds.Tables[0].Rows[0]["AI结存"];
                 }
    2009年11月6日 8:42

答案

  • 你好!

    你这里在 CellValueChanged ,又重新对 Cell 赋值,这样会造成死循环。可以参考下面的方式。

    bool sysAction = false;

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
    if (sysAction) return;

    sysAction = true;
    dataGridView1.Rows[e.RowIndex].Cells[6].Value = 0;
    sysAction = false;
    }

    知识改变命运,奋斗成就人生!
    2009年11月6日 8:59
    版主
  • 你好!
         你在CellValueChanged事件中再次对Cell值进行了修改,这样会再次触发 CellValueChanged事件,所以形成了无限循环!
    周雪峰
    2009年11月6日 9:28
    版主
  • int changeCounter=-1;
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
            changeCounter++;
            if(changeCounter==0)
            {
                 //在这里写你的代码。。。
            }
            changeCounter--;
    }
    2009年11月8日 13:19

全部回复

  • 你好!

    你这里在 CellValueChanged ,又重新对 Cell 赋值,这样会造成死循环。可以参考下面的方式。

    bool sysAction = false;

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
    if (sysAction) return;

    sysAction = true;
    dataGridView1.Rows[e.RowIndex].Cells[6].Value = 0;
    sysAction = false;
    }

    知识改变命运,奋斗成就人生!
    2009年11月6日 8:59
    版主
  • 你好!
         你在CellValueChanged事件中再次对Cell值进行了修改,这样会再次触发 CellValueChanged事件,所以形成了无限循环!
    周雪峰
    2009年11月6日 9:28
    版主
  • int changeCounter=-1;
    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
            changeCounter++;
            if(changeCounter==0)
            {
                 //在这里写你的代码。。。
            }
            changeCounter--;
    }
    2009年11月8日 13:19