当所有者窗体关闭时,启用/禁用所有者窗体上的按钮



我正在c# . net中开发一个WinForms桌面应用程序。目标框架是。net framework 4.8。当应用程序启动时,将显示带有几个按钮的主表单。每个按钮在单击时隐藏主表单并打开另一个表单,该表单显示与用户交互的数据。主表单是新表单的所有者。

一个按钮打开一个表单,该表单在数据网格视图中显示来自网络共享文件夹的文件列表。用户在数据网格中选择一行,单击按钮将文件中的信息导入到SQL Server数据库中的各个表中。导入完成后,将从数据网格中删除所选行。当用户关闭此表单时,form Closed事件中有代码显示其所有者。 我的问题是,当主表单是不隐藏的,我需要禁用按钮,打开表单,列出文件导入,如果没有任何文件在网络共享文件夹导入。还有一行代码用于更改按钮的文本属性,通知用户没有任何文件要导入。 我意识到我可以在visible echange事件中放置代码来禁用按钮并更改按钮文本。但是,我只希望代码运行后拥有的窗体的关闭事件显示所有者窗体。如何将代码包含在主表单的visblechanged事件中,以便仅在拥有的表单关闭后禁用文件导入按钮。或者,是否可以在Owner.Show(); 之前的form Closed事件中编辑所有者表单上的按钮属性?我发现了一个类似的问题,WinForm Form Closed Event。但当我听从建议时
private void LoadChildForm_Click(object sender, EventArgs e)
{
ChildForm form = new ChildForm();
form.FormClosed += new FormClosedEventHandler(ChildFormClosed);
form.Show();
}

替换我的名字

private void btnImportHFR_Click(object sender, EventArgs e)
{
Form form = new frmHFRFiles();
form.FormClosed += new FormClosedEventHandler(frmHFRFiles_FormClosed);
form.Show(this);
Hide();
}

Visual Studio将frmHFRFiles_FormClosed标记为错误,因为名称在当前上下文中不存在。

ChildForm form = new ChildForm(this);

然后在ChildForm构造函数中:

MainForm m_MainForm;
Public ChildForm (MainForm mainForm)
{
m_MainForm = mainForm;
}

Then in closing event:

m_MainForm.button1.Enabled = false;

确保button1是公共的

我是这样做的。我在主表单中创建了一个布尔变量,并将初始值设置为false。

private bool updateButtons = false;

主表单的构造函数在网络文件夹中搜索文件。

public frmMainMenu()
{
InitializeComponent();
Shared.FilesForImport = GetHFRFiles();
}

表单的load事件调用EnableButtons()方法

public void EnableButtons()
{
btnImportHFR.Enabled = Convert.ToBoolean(Shared.FilesForImport.Count);
btnImportHFR.Text = btnImportHFR.Enabled ? "Find Available HFR" : "No HFR For Import";
btnGetFacilityStatus.Enabled = Shared.sqlWrap.GetDataForFacStat(Shared.DsFacStat);
updateButtons = false;
}

主表单的可见改变事件在表单加载事件之后触发。因为updateButtons的值被设置为false,所以不再搜索网络文件夹。

private void frmMainMenu_VisibleChanged(object sender, EventArgs e)
{
if(updateButtons)
{
EnableButtons();
}
}

在按钮点击事件中,隐藏主表单后,updateButtons值被设置为true。

private void btnImportHFR_Click(object sender, EventArgs e)
{
frmHFRFiles form = new frmHFRFiles();
form.Show(this);
Hide();
updateButtons = true;
}

子窗体的关闭事件调用Owner.Show()方法

private void frmHFRFiles_FormClosed(object sender, FormClosedEventArgs e)
{
Owner.Show();
}

这将导致主表单的可见更改事件被触发。只有这一次EnableButtons()方法会运行,因为updateButtons的值为true。

private void frmMainMenu_VisibleChanged(object sender, EventArgs e)
{
if(updateButtons)
{
EnableButtons();
}
}
public void EnableButtons()
{
btnImportHFR.Enabled = Convert.ToBoolean(Shared.FilesForImport.Count);
btnImportHFR.Text = btnImportHFR.Enabled ? "Find Available HFR" : "No HFR For Import";
btnGetFacilityStatus.Enabled = Shared.sqlWrap.GetDataForFacStat(Shared.DsFacStat);
updateButtons = false;
}

最后,EnableButtons()方法将updateButtons的值设置为false。

这对我来说似乎很简陋,但它很有用。谢谢大家的反馈。

我的问题是,当主表单未隐藏时,我需要禁用打开表单以列出要导入的文件的按钮,如果网络共享文件夹中没有要导入的任何文件。还有一行代码用于更改按钮的文本属性,通知用户没有任何文件要导入。

所以你的主表单有一个按钮x,如果这个按钮被点击一个方法被调用。此方法将首先隐藏表单,然后显示子表单,直到子表单关闭。该方法应该禁用按钮X,更改按钮的文本并取消隐藏表单。

为了使它更灵活,我们不会在一个过程中做所有的事情,我们根据过程的意图创建几个过程:"通知操作符没有文件要导入"禁用打开子窗体",当然还有它们的对应物"启用打开子窗体", "通知操作符有文件要导入">

TODO: invent合适的方法名

private void ShowNoFilesToImport()
{
this.buttonX.Text = ...;
}
private void DisableOpeningSubForm()
{
this.buttonX.Text.Enabled = false;
}

这样做的好处是,如果你以后想要改变你想要通知操作员的方式,例如,如果你想在屏幕底部使用一个信息字段,你只需要在一个地方改变它。

此外,您可以重用这些过程,例如,您可以添加一个菜单项,它将执行与按钮X相同的操作,该菜单项可以调用相同的方法

private void PerformActionsButtonX()     // TODO: invent proper name
{
// Hide this form, and show the Subform until it is closed
this.Visible = false;
using (var dlg = new SubForm())
{
// if needed, set properties of the subForm:
dlg.Text = ...
dlg.Position = ...
// show the form until it is closed
var dlgResult = dlg.ShowDialog();
this.ProcessDlgResult(dlgResult, dlg);
}
// Show that there are no files to Import and disable OpeningSubform
this.ShowNoFilesToImport();
this.DisableOpeningSubform();
// Finally: show this form:
this.Visible = true;
}

当然,当按钮x或菜单项Y被点击时调用这个方法:

private void OnButtonX_Clicked(object sender, ...)
{
this.PerformActionsButtonX();
}
private void OnMenyItemYClicked(object sender, ...)
{
this.PerformActionsButtonX();
}

最新更新