C# 从另一个窗体访问窗体

C# 从另一个窗体访问窗体,c#,winforms,C#,Winforms,我试图将三角形显示到第一个窗体(称为MainForm),我创建了另一个窗体(CarreGen),它要求用户选择1到15之间的值(X和Y),但问题是我将窗体链接在一起,当我单击按钮时,三角形没有显示 要显示的标签=lblResultat PS:我试图寻找答案,但我仍然被这个错误所困扰 MainForm.cs: private void carréToolStripMenuItem_Click(object sender, EventArgs e) { carrG.Show(); //dec

我试图将三角形显示到第一个窗体(称为
MainForm
),我创建了另一个窗体(
CarreGen
),它要求用户选择1到15之间的值(X和Y),但问题是我将窗体链接在一起,当我单击按钮时,三角形没有显示

要显示的标签=lblResultat

PS:我试图寻找答案,但我仍然被这个错误所困扰

MainForm.cs:

private void carréToolStripMenuItem_Click(object sender, EventArgs e)
{
    carrG.Show(); //declared before
}

public void GenCarre()
{
    try
    {
        for (int i = 0; i < carrG.nombre; i++) 
        {
            lblResultat.Text = "\n";

            for (int j = 0; j < carrG.nombre; j++) 
            {
                lblResultat.Text = "\t \t *";
            }
        }

        Figgen();
    }
    catch (Exception)
    {
        throw new Exception("Erreur lors de la génération.");
    }
}
private void carréToolStripMenuItem_Click(对象发送方,事件参数e)
{
carrG.Show();//之前声明
}
公共资源(GenCarre)
{
尝试
{
for(int i=0;i
CarreGen.cs:

public partial class CarreGen : Form
{
    public int nombre;
    public bool CGen;

    public CarreGen()
    {
        InitializeComponent(); 
    }

    void Figgen()
    {
        MessageBox.Show("Figure générée avec succès !", "Succès", 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Information);
    }

    private void btnGenCarre_Click(object sender, EventArgs e)
    {
        FormMain mform = new FormMain();

        if(!int.TryParse(txtInt.Text,out nombre))
        {
            MessageBox.Show("Vous n'avez pas saisi un chiffre !", 
                "Erreur", MessageBoxButtons.OK, 
                MessageBoxIcon.Error);
        }
        else if(int.TryParse(txtInt.Text,out nombre))
        {
            if (nombre <= 0)
            {
                MessageBox.Show("La valeur est inférieure à 1.\nVeuillez saisir une valeur entre 0 et 15.","Erreur",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
            else if (nombre > 16)
            {
                MessageBox.Show("La valeur est supérieure à 15.\nVeuillez saisir une valeur entre 0 et 15.", "Erreur",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
            else
            {
                Hide();
                mform.GenCarre();
            }
        }
        else
        {
            MessageBox.Show("Erreur lors de la génération du carré.", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return;
        }
    }
}
公共部分类CarreGen:表单
{
公共国际名称;
公共图书馆;
公共事业()
{
初始化组件();
}
void Figgen()
{
MessageBox.Show(“图générée avec success!”,“success”,
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
私有无效btnGenCarre\u单击(对象发送者,事件参数e)
{
FormMain mform=新FormMain();
如果(!int.TryParse(txtInt.Text,out nombre))
{
MessageBox.Show(“你有空!”,
“Erreur”,MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
else if(int.TryParse(txtInt.Text,out nombre))
{
如果(名称16)
{
MessageBox.Show(“La valeur est supérieureá15.\nVeilez saiser une valeur entre 0 et 15.”,“Erreur”,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
其他的
{
隐藏();
mform.GenCarre();
}
}
其他的
{
MessageBox.Show(“Erreur lors de la génération du carré.”,“Erreur”,MessageBoxButtons.OK,MessageBoxIcon.Error);
返回;
}
}
}

尝试使用界面连接表单

以下是我的解决方案:

  • 创建只有一种方法的新接口
    iRequestStor

    public interface IRequestor
    {
        void SetNumber(double valueBetween1and15);
    }
    
  • 修改
    MainForm
    以使用此界面,例如

    public partial class MainForm : Form, IRequestor
    {
    
        public MainForm()
        {
            InitializeComponent();
        }
    
    
        private double number;
    
        public void SetNumber(double valueBetween1and15)
        {
            number = valueBetween1and15;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            var carreGenForm = new CarreGen(this);
            carreGenForm.ShowDialog();
    
            // After that you can use 'number'
    
            // further code
        }
    }
    
  • 修改
    CarreGen
    表单以获得指向
    IRequestor
    的链接:

    public partial class CarreGen : Form
    {
        private IRequestor requestor;
    
        public CarreGen(IRequestor requestor)
        {
            this.requestor = requestor;
    
            InitializeComponent();
        }
    
        private void BtnGenCarre_Click(object sender, EventArgs e)
        {
            // some code...
            double number = 17;
    
            // Send value to MainForm
            requestor.SetNumber(number);
    
            // Close form
            this.Close();
        }
    }
    

在返回结果之前,第二张表格将关闭。看看我的两种形式的项目:有趣,我会尝试,我会告诉它是否有效:)这不会起作用。第二个表单在第一个表单读取返回值之前被释放。不,第二个表单(
CarreGen
)向第一个表单发送一个数字,然后才真正关闭。再看一遍代码!!!this.close在第一个窗体读取数字之前处理了第二个窗体。然后,您有一个竞争条件,幸运的是一个进程在另一个进程处理对象之前执行。老实说,
this.close()
在那里是不必要的。第二个窗体可以由用户通过交叉按钮或其他方式关闭。但它将数据发送到第一个表单。