C#无法更改对话框中的标签和按钮属性

我有我的主窗体和一个从main调用的对话框。 在我的主要表单中,我有一个标签和一个按钮,我无法更改这些属性。 我正在使用Visual Studio 2015,不确定是否存在此问题。 我还确保我的标签和按钮设置为公开修改。

代码:(这是从对话框中,这个列表框中的函数是在selectindexchange中触发的)

else if ((short)lbDiscountTypes.SelectedValue == 2) //Senior { frm_Main main = new frm_Main(); main.VAT = false; main.labelStatus.Text = "NON-VAT (SENIOR)"; main.labelStatus.BackColor = System.Drawing.Color.IndianRed; main.labelStatus.ForeColor = System.Drawing.Color.WhiteSmoke; main.btnNonVat.Enabled = false; main.btnNonVat.BackColor = System.Drawing.Color.SlateGray; main.btnNonVat.ForeColor = System.Drawing.Color.Navy; main.labelVatAmount.Text = 0.00m.ToString(); main.Dispose(); //INQUIRE DISCOUNT TYPES var Discount = GC.CSHR_DiscountTypes.Where(Filter => Filter.DiscountCode == (short)lbDiscountTypes.SelectedValue); decimal DP = 0.00m; foreach (var item in Discount) { DP = item.DiscountPercentage; } foreach (var item in GC.CSHR_SORepo .Where(Filter => Filter.Machine == MACHINE && Filter.SalesOrderNum == SALESORDERNUM && Filter.First_SRP == Filter.IMFSRP)) { item.DiscountAmount = (item.SoldSRP * DP) / 100; item.TotalAmount = (item.Quantity * item.SoldSRP) - item.DiscountAmount; item.VATableSalesOnTotalAmount = (item.Quantity * item.SoldSRP) - item.DiscountAmount; item.VATRate = 0.00m; GC.SaveChanges(); } Close(); } 

下面的代码//INQUIRE DISCOUNT TYPES运行良好,但不是顶部的代码。 我已经使用调试模式来检查是否没有跳过这些行而它们不是。

你应该注意:

  • 您正在创建一个您不需要的主表单的新实例(当它在对话框后面打开时),因此您需要让它不创建新实例

  • 您正在处理您创建的主表单。 main.Dispose();

实际上,您正在创建一个新的主窗体实例,并为这些控件赋值,然后将其处理掉。 虽然你希望看到它的主要forms的实例和实例在你的对话框后面是开放的和未被触及的。

要设置这些控件的值,您可以执行以下方法之一:

选项1

使您的labelStatus和btnNonVat公开。 在设计器中打开主窗体并选择labelStatus和btnNonVat,在属性网格中,将Modifier设置为public。 然后写下这段代码:

 //var main = Application.OpenForms.OfType().FirstOrDefault(); var main = (frm_Main)Application.OpenForms["frm_Main"]; main.labelStatus.Text = "NON-VAT (SENIOR)"; main.labelStatus.BackColor = System.Drawing.Color.IndianRed; main.labelStatus.ForeColor = System.Drawing.Color.WhiteSmoke; main.btnNonVat.Enabled = false; main.btnNonVat.BackColor = System.Drawing.Color.SlateGray; main.btnNonVat.ForeColor = System.Drawing.Color.Navy; main.labelVatAmount.Text = 0.00m.ToString(); 

选项2

将frm_Main的实例传递给对话框并使用它。

选项3

关闭对话框后,使用对话框中的值并设置主窗体的值

看起来你正在尝试使用frm_Main main = new frm_Main();创建新表单frm_Main main = new frm_Main(); 句法。 您需要做的就是获取当前表单的实例。

  var _currentMainForm= Application.OpenForms[0]; 

或者如果您已为表格命名

  var _currentMainForm = Application.OpenForms["MainFormName"]; 

获得参考后,您可以执行所有标签更新。

顶部的代码创建一个新表单,更改标签,然后处理表单。 我认为你应该改变现有表格的标签。

就像在另一个答案中说的那样,你将控件的属性设置为一个新的Form对象而不是你来自的forms。 您应该将表单对象传递给对话框的参数,例如:

 void myDialog(frm_Main callingForm) { callingForm.Textbox1.Text = "abc"; } 

并从这个主要表单中调用它

 ... myDialog(this);