【问题标题】:Exception of type 'System.StackOverflowException' was thrown in c#在 c# 中引发了“System.StackOverflowException”类型的异常
【发布时间】:2018-11-29 17:08:22
【问题描述】:

我正在尝试调用表单

public partial class MenuForm : Form
    {

        Ventanas v = new Ventanas();
        EnfermoRep reporteEnfermo = new EnfermoRep();
        public MenuForm()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void rptEnfermo_Click(object sender, EventArgs e)
        {
            v.CargarVentana(reporteEnfermo, this.panel1);
        }
    } 

但是当我运行它时,当我实例化“EnfermoRep”时,会标记“抛出了“System.StackOverflowException”类型的异常。

这是另一个类

public partial class EnfermoRep : Form
    {

        Ventanas v = new Ventanas();
        MenuForm menuForm = new MenuForm();
        public EnfermoRep()
        {
            InitializeComponent();
        }

        private void EnfermoRep_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'bd.Enfermo' table. You can move, or remove it, as needed.
            this.EnfermoTableAdapter.Fill(this.bd.Enfermo);

            this.reportViewer1.RefreshReport();
        }

        private void btnVolver1_Click(object sender, EventArgs e)
        {
            v.CargarVentanas(menuForm, this.enfermoRep);
        }
    }

我也在使用这个,所以我可以只用一种形式在面板之间切换:

class Ventanas
    {
        public void CargarVentana(object sonform, Panel panel)
        {
            panel.Controls.Clear();
            Form fh = sonform as Form;
            fh.TopLevel = false;
            fh.FormBorderStyle = FormBorderStyle.None;
            fh.Dock = DockStyle.Fill;
            panel.Controls.Add(fh);
            panel.Tag = fh;
            fh.Show();
        }
}

在我制作的每一个表单中,我都会在容器中放置一个面板停靠栏,这样我就可以使用“Ventana”类来调用它

知道如何解决该错误。谢谢! :D

【问题讨论】:

  • 你在MenuForm中创建一个EnfermoRep,然后在EnfermoRep中创建一个MenuForm,这就是创建对象的无限循环。
  • 如果名字是英文的,人们会更容易帮助你 - StackOverflow 是用英文提问的。 “CargarVentanas”翻译为“LoadWindows”。没有这种理解,人们就更难理解你在做什么,因此他们也更难帮助你。 “EnfermoRep”谷歌翻译为“Sick rep”;但我猜它可能应该是“关闭报告”?但我不应该这么辛苦来帮助你。或者换一种说法,我会选择花时间回答一个不需要翻译的问题。
  • 下次我会做的,谢谢你的建议! c: 是的,“Enfemorep”是一个包含所有患病人数报告的表格

标签: c# visual-studio


【解决方案1】:

希望我没有错,但一个简单的解决方法(可能不是一个好的解决方法)是:

public partial class MenuForm : Form
{

    Ventanas v = new Ventanas();
    EnfermoRep reporteEnfermo;
    public MenuForm()
    {
        InitializeComponent();
        reporteEnfermo = new EnfermoRep(this);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void rptEnfermo_Click(object sender, EventArgs e)
    {
        v.CargarVentana(reporteEnfermo, this.panel1);
    }
} 

public partial class EnfermoRep : Form
{

    Ventanas v = new Ventanas();
    MenuForm menuForm;
    public EnfermoRep(MenuForm MF)
    {
        menuForm = MF;
        InitializeComponent();
    }

    private void EnfermoRep_Load(object sender, EventArgs e)
    {
        this.EnfermoTableAdapter.Fill(this.bd.Enfermo);

        this.reportViewer1.RefreshReport();
    }

    private void btnVolver1_Click(object sender, EventArgs e)
    {
        v.CargarVentanas(menuForm, this.enfermoRep);
    }
}

虽然不确定这是否能整体解决您的问题,但它确实摆脱了 stackoverflow。这只是一个小小的改变。您只需将 MenuForm 作为参数传递,而不是在 EnfermoRep 类中创建一个新的。在此解决方案中,必须首先创建 MenuForm。为了能够首先创建 EnfermoRep 进行必要的更改并不难。我会把它作为一项任务;)

【讨论】:

    【解决方案2】:

    当你构造MenuForm时,这段代码运行:

    EnfermoRep reporteEnfermo = new EnfermoRep();` 
    

    当你构造EnfermoRep时,这段代码运行:

    MenuForm menuForm = new MenuForm();
    

    你最终会永远递归。如果您查看您的堆栈面板,您将看到堆栈创建一个EnfermoRep,然后是一个MenuForm,并永远重复该序列。你需要解开你的代码。通常,如果您想同时运行两个表单,请在其他位置(例如在您的 Main 例程中)创建这两个表单,然后从那里运行它们。

    【讨论】:

    • 是的,正如上面的评论,你说,我正在这样做,但这是因为我想从 EnfermoRep 回到 MenuForm。
    • MenuForm 调用 EnfermoRep,我在 EnfermoRep 中添加了 I 按钮,以便可以返回到 MenuForm,但我只是不知道如何
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多