TextBox.Text 正在处理,即使在重新创建表单时也是如此
TextBox.Text is being disposed, even when creating the form again
我一直在开发 C# PDA。
最近发现一个bug。
步数
这是重现它的步骤:
输入表格,扫描一些数据。
关闭表单。
重新打开表格。
- 当您扫描数据时,一些 TextBox 似乎被处理掉了。
代码
我们创建表单:
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);
}
}
}
Form的第一行是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();
当我们到达class中的方法时,我们得到当前上下文:
void myBarcode_OnScan(ScanDataCollection sd) {
context = this;
this.tbp1_1 = getTbl1_1();
但这是错误的,对象似乎已被处置:
编辑:当我单击第一段代码中显示的按钮时,应该会创建表单。当我关闭表格时,它应该被处理掉。 Dispose方法的代码是这样的:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
似乎 Initialize 组件在第二个 运行 上也能正常工作,但是当它到达扫描方法时,TextBox 会被处理....
问题
我是 C# 开发的新手,所以有点迷茫。
我的猜测是 Dispose 部分出了问题。
有什么方法可以解决这个问题?
谢谢!
终于找到解决方法了
找出问题所在后,我发现 SCAN 事件一直保持活动状态。
我添加了关闭覆盖:
this.Closing += MyClosedHandler;
而MyClosedHandlerEvent如下:
protected void MyClosedHandler(object sender, EventArgs e)
{
this.myBarcode2.ScanCancel();
this.myBarcode2.Disable();
if (myBarcode2 != null) this.myBarcode2.Dispose();
}
扫描仪事件处理程序检测到问题。
希望这对其他人有帮助!
我一直在开发 C# PDA。 最近发现一个bug。
步数
这是重现它的步骤:
输入表格,扫描一些数据。
关闭表单。
重新打开表格。
- 当您扫描数据时,一些 TextBox 似乎被处理掉了。
代码
我们创建表单:
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);
}
}
}
Form的第一行是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();
当我们到达class中的方法时,我们得到当前上下文:
void myBarcode_OnScan(ScanDataCollection sd) {
context = this;
this.tbp1_1 = getTbl1_1();
但这是错误的,对象似乎已被处置:
编辑:当我单击第一段代码中显示的按钮时,应该会创建表单。当我关闭表格时,它应该被处理掉。 Dispose方法的代码是这样的:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
似乎 Initialize 组件在第二个 运行 上也能正常工作,但是当它到达扫描方法时,TextBox 会被处理.... 问题
我是 C# 开发的新手,所以有点迷茫。
我的猜测是 Dispose 部分出了问题。
有什么方法可以解决这个问题?
谢谢!
终于找到解决方法了
找出问题所在后,我发现 SCAN 事件一直保持活动状态。
我添加了关闭覆盖:
this.Closing += MyClosedHandler;
而MyClosedHandlerEvent如下:
protected void MyClosedHandler(object sender, EventArgs e)
{
this.myBarcode2.ScanCancel();
this.myBarcode2.Disable();
if (myBarcode2 != null) this.myBarcode2.Dispose();
}
扫描仪事件处理程序检测到问题。
希望这对其他人有帮助!