就是简单的手持机 扫描条码界面
首先判断该条码在这个单号里又没,没有的话就添加,然后关闭当前窗口,重新加载该窗口,
this.Name 为单号
现在的问题是扫描一会儿就出现如下错误 
未处理的 system.stackoverflowexceptionprivate void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string sqlcount = "select count(*) from mb_xs_detail where sheet_no='" + this.Name + "' and  item_no='" + this.textBox1.Text + "'";
                SQLCEWrapper cetest = new SQLCEWrapper();
                int i = int.Parse(cetest.ReObjectvalue(sqlcount).ToString());                if (textBox1.Text == "")
                {
                    MessageBox.Show("请输入条码");
                    this.textBox1.Focus();
                }                else if (i != 0)
                {
                    MessageBox.Show("该条码已存在");
                    this.textBox1.Text = "";
                    this.textBox1.Focus();
                }
                
                else
                {
                   // SQLCEWrapper cetest = new SQLCEWrapper();                    string sqlgetid = "select max(SUBSTRing(id,3,5)) from mb_xs_detail";
                    string newid = cetest.Getid(sqlgetid);                    string SQLstr = "INSERT INTO mb_xs_detail (id,sheet_no,item_no) values ('" + newid + "','" + this.Name + "','" + this.textBox1.Text + "')";
                    //string SQLstr = "INSERT INTO mb_xs_detail (id,sheet_no,item_no) values ('00009'" + this.Name + "','" + this.textBox1.Text + "')";
                    cetest.ExecuteNoResult(SQLstr);
                    this.Dispose();
                    SendDetail form1 = new SendDetail(this.Name);
                    form1.ShowDialog();  //模式窗口,先运行Form1的作用
                }
            }         }窗口初始化的代码
this.textBox2.Text = "销售发货-" + this.Name;
            this.lbczy.Text = user.UserName;
                       string strSql = "SELECT id as 流水号,item_no as 条码,sheet_no 单号  FROM mb_xs_detail where sheet_no='" + this.Name + "'";
            string sqlcountqty = "select count(*) from mb_xs_detail where sheet_no='" + this.Name + "'";            SQLCEWrapper cetest = new SQLCEWrapper();
            int j = int.Parse(cetest.ReObjectvalue(sqlcountqty).ToString());
            this.lbqty.Text = j.ToString();
            
            // 将 ResultSetView 绑定到 DataGrid 控件
            this.dataGrid1.DataSource = cetest.resultSetView(strSql);            //设置DataGrid 列宽 第一步
            DataGridTableStyle myDataGridStyle = null;
            GridColumnStylesCollection myDataGridColStyle = null;
            myDataGridStyle = new DataGridTableStyle();
            dataGrid1.TableStyles.Clear(); // 先清除格式
            dataGrid1.TableStyles.Add(myDataGridStyle);//加载格式            // 设置dataGrid 列的宽度
            myDataGridColStyle = dataGrid1.TableStyles[0].GridColumnStyles;
            myDataGridColStyle[0].Width = 55;
            myDataGridColStyle[1].Width = 150;
            myDataGridColStyle[2].Width = 120;
        }

解决方案 »

  1.   

    var name = this.Name;
    this.Dispose();
    SendDetail form1 = new SendDetail(name);
      

  2.   

    你的逻辑很有问题,先调用this.Dispose();后再执行其它和this相关的代码,这意味着那个this.Dispose()将被压入堆栈延后响应,你操作次数越多,压入堆栈的数量就越多,自然会堆栈溢出了。
    这里既然是打开自己,那就根本没有必要先关闭自己,直接更新界面上的元素即可,这样效率更高,速度更快。
      

  3.   

    确实是调用this.Dispose()的顺序错了,这样堆栈溢出的问题解决了。
     
    你说直接更新元素,提高效率,是不是插入了数据后,再次 重载datagrid ?
      

  4.   

    很简单啊,复制初始化窗口的代码,保留“this.dataGrid1.DataSource =”之前的那部分,稍加修改以便重新得到DataGrid的数据源即可。
      

  5.   

    string sheetno = This.Name ;
                          SendDetail form2 = new SendDetail(sheetno);
                          form2.ShowDialog();  //模式窗口,先运行Form1的作用
                          this.Dispose();
    string sheetno = This.Name ;
                           this.Dispose();
                          SendDetail form2 = new SendDetail(sheetno);
                          form2.ShowDialog();  //模式窗口,先运行Form1的作用
                          不管  this.Dispose(); 都是会堆栈溢出 。望帮忙解决