TextBox.Text被丢弃,即使再次创建表单也是如此

时间:2019-07-09 12:37:25

标签: c# forms dispose

我一直在研究C#PDA。 最近我发现了一个错误。

步骤

这是复制它的步骤:

  1. 输入表格,扫描一些数据。

  2. 关闭表单。

  3. 重新打开表单。

  4. 当您扫描数据时,某些文本框似乎已被丢弃。

代码

我们创建表单:

 private void btp1_1_Click(object sender, EventArgs e) {            
            if(AppCore.core.pdaUser.isAuthorizedMovement(Movements.AltaPalet) == false) {
                MessageBox.Show("No estás autorizado para realizar esta operación.");
            } else {
                try{
                    //MessageBox.Show("Funcionalidad en desarrollo. Disculpe las molestias");
                    FormAltaPalet form = new FormAltaPalet(Movements.AltaPalet);
                    form.ShowDialog();
                    form.Dispose();
                }catch(WebException ex){
                    MessageBox.Show("Error técnico. " + ex.Message);
                }
            }
        }

表单的第一行是InitializeComponent。

  public FormAltaPalet(Movements movement) {

           // GC.Collect();
           // GC.WaitForPendingFinalizers();
            InitializeComponent();
            //clear(FormStep.Step1);
           // this.FinishError(); // FIX MA 08.07.2019
            this.move = movement;
            this.tbp1_1.Focus();
            this.material = "";
            this.ean14 = "";
            context = this;

            // SCANNER
            if (AppCore.core.dispositivo_PDA ) { // BARCODE 2
                myBarcode2 = new Barcode2(Devices.SupportedDevices[0]);
                myBarcode2.Enable();
                myBarcode2.Scan();
                // Register a scan event handler to the barcode object
                myBarcode2.OnScan += new Barcode2.OnScanHandler(myBarcode_OnScan);
            }
        }

在这里,我们创建文本框和标签。第一次运行时,它工作正常,再次关闭并再次打开时,它开始失败。

   private void InitializeComponent()
        {
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAltaPalet));
            this.pmm = new System.Windows.Forms.Panel();
            this.bt_mm_2 = new System.Windows.Forms.Button();
            this.bt_mm_1 = new System.Windows.Forms.Button();
            this.p1 = new System.Windows.Forms.Panel();
            this.label_error_1 = new System.Windows.Forms.Label();
            this.btp1_2 = new System.Windows.Forms.Button();
            this.lbp1_6 = new System.Windows.Forms.Label();
            this.tbp1_6 = new System.Windows.Forms.TextBox();
            this.tbp1_4 = new System.Windows.Forms.TextBox();
            this.tbp1_3 = new System.Windows.Forms.TextBox();
            this.tbp1_2 = new System.Windows.Forms.TextBox();
            this.tbp1_1 = new System.Windows.Forms.TextBox();
            this.lbp1_4 = new System.Windows.Forms.Label();
            this.lbp1_3 = new System.Windows.Forms.Label();
            this.lbp1_2 = new System.Windows.Forms.Label();
            this.lbp1_1 = new System.Windows.Forms.Label();
            this.pbp1_1 = new System.Windows.Forms.PictureBox();
            this.pmm.SuspendLayout();
            this.p1.SuspendLayout();
            this.SuspendLayout();

当我们到达类中的方法时,我们将获得当前上下文:

  void myBarcode_OnScan(ScanDataCollection sd) {
            context = this;
            this.tbp1_1 = getTbl1_1();

但这是错误的,对象似乎已被处置:

https://imgur.com/bayiySg

编辑:当我单击第一段代码中显示的按钮时,应创建表格。当我关闭表格时,应该将其丢弃。 Dispose方法的代码是这样的:

   protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

似乎Initialize组件也可以在第二次运行中很好地工作,但是当到达scan方法时,将放置TextBox。 问题

我对C#开发非常陌生,所以我有点迷失了。

我的猜测是“处置”部分正在发生某些事情。

有什么办法解决此问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案。

弄清楚问题出在哪里后,我发现SCAN事件仍然存在。

我添加了一个关闭替代:

 this.Closing += MyClosedHandler;

MyClosedHandlerEvent如下:


        protected void MyClosedHandler(object sender, EventArgs e)
        {
           this.myBarcode2.ScanCancel();
            this.myBarcode2.Disable();
            if (myBarcode2 != null) this.myBarcode2.Dispose();
        }

使用扫描仪事件处理程序检测到问题。

希望这会对其他人有所帮助!