【问题标题】:Trying to use another form's function but not working尝试使用其他表单的功能但无法正常工作
【发布时间】:2018-11-03 10:15:07
【问题描述】:

我想在另一个打开时禁用我的表单,并在关闭时启用。但是另一种形式可能会自行关闭并打开新形式,所以我写了一个函数,它获取布尔值并启用和禁用表单和键。打开新表单时它可以工作,但关闭时该表单不起作用。

这里是主要形式:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Win32;

namespace Automation_v1_0_0
{
    public partial class FormMain : Form
    {
        bool keysActivated = true;

        public FormMain()
        {
            InitializeComponent();
        }
        public void anotherForm(bool anotherform)
        {
            if (anotherform)
            {
                this.Enabled = false;
                keysActivated = false;
            }
            else
            {
                this.Enabled = true;
                keysActivated = true;
            }
        }

        private void FormMain_KeyDown(object sender, KeyEventArgs e)
        {
            if (keysActivated)
            {
                if (e.KeyCode == Keys.F7)
                {
                    FormSettings settings = new FormSettings();
                    anotherForm(true); // Enters and working.
                    settings .Show();
                }
            }
        }
    }
}

这是我的设置表单:

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Automation_v1_0_0
{
    public partial class FormAyarlarMenu : Form
    {
        public FormSettings()
        {
            InitializeComponent();
        }
        private void FormSettings_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape || e.KeyCode == Keys.F1)
            {
                FormMain fm = new FormMain();
                fm.anotherForm(false); // Enters but not working.
                this.Close();
            }
        }    
    }
}

【问题讨论】:

  • 你创建了一个新的 FormMain,它不是已经存在的。
  • 我认为您要做的是将setting 表单作为模式打开,如果这是正确的,那么您可以使用settings.ShowDialog() 这将禁用对父调用者的任何点击并打开子窗体作为模态。如需更多参考,请查看此link

标签: c# winforms


【解决方案1】:

我已经解决了问题。这是我的代码:

namespace Automation_v1_0_0
{
    public partial class FormMain : Form
    {    
        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F7)
            {
                FormSettings settings = new FormSettings();
                 settings.ShowDialog();
            } 
        }
    }
}

【讨论】:

  • 这会起作用,但最好在使用后处理设置表单。最简单的方法是将设置表单的创建放入Using()construct
  • 另外我不认为你还需要keysActivatedvariable
  • 我希望你能像我的回答那样做,因为这段代码有内存泄漏
【解决方案2】:

主要形式:

public partial class FormMain : Form
{
    bool keysActivated = true;

    public FormMain()
    {
        InitializeComponent();
    }

    private void FormMain_KeyDown(object sender, KeyEventArgs e)
    {
        if (keysActivated)
        {
            if (e.KeyCode == Keys.F7)
            {
                this.Hide();
                FormSettings settings = new FormSettings(this);
                settings.Show();
            }
        }
    }
}

设置形式:

public partial class FormSettings : Form
{
    private FormMain formMain;

    public FormSettings(FormMain formMain)
    {
        InitializeComponent();
        this.formMain = formMain;
    }

    private void FormSettings_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape || e.KeyCode == Keys.F1)
        {
            this.Close();
            formMain.Show();
        }
    }
}

您的问题是您实例化了新的FormMain 对象而不是使用现有的对象!解决方案是将FormMain 的当前实例传递给设置表单以使用它。

【讨论】:

  • 为什么要在FormSettings中新建一个FormMain实例?
  • 抱歉,复制和粘贴出现印刷错误!编辑。谢谢@GuidoG
【解决方案3】:

虽然它可以很简单,但你正在让它变得复杂

在你的主窗体中这样做:

    private void FormMain_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F7)
        {
            using (FormSettings settings = new FormSettings())
            {
              settings.ShowDialog();
            }
        }
    }

然后删除您不需要的所有其他代码。
把方法去掉另一种形式,你不需要那个。

在您的设置表单中执行此操作

private void FormSettings_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Escape || e.KeyCode == Keys.F1)
    {
        this.Close();
    }
}    

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多