C# 两个表单之间的连接

C# 两个表单之间的连接,c#,winforms,dictionary,C#,Winforms,Dictionary,我正在以第一种形式创建对象并将其添加到字典中。 我想在第二种形式中搜索它,因为我想根据在第一种形式中创建的对象在面板上绘制符号 我看到了这个 但我不知道,我怎么才能在Form2中添加一个构造函数,它以一个表单作为参数 我试图制作单例字典,但我也不知道如何从foreach循环中的字典中获取值 当一切都是这样的时候,我应该这样做:luskanie.value.rodzaj,如果我有两种形式,这就不起作用了 来自form1字典的代码: public partial class Form1 :

我正在以第一种形式创建对象并将其添加到字典中。 我想在第二种形式中搜索它,因为我想根据在第一种形式中创建的对象在面板上绘制符号

我看到了这个 但我不知道,我怎么才能在Form2中添加一个构造函数,它以一个表单作为参数

我试图制作单例字典,但我也不知道如何从foreach循环中的字典中获取值

当一切都是这样的时候,我应该这样做:luskanie.value.rodzaj,如果我有两种形式,这就不起作用了

来自form1字典的代码:

     public partial class Form1 : Form
    {

        public static Dictionary<int, baza> naszalista = new Dictionary<int, baza>(); 


This is second form:


    namespace _1dwa3
    {
        public partial class diagram : Form
        {

        public diagram()
        {
            InitializeComponent();
        }

        private void diagram_Load(object sender, EventArgs e)
        {

        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            SolidBrush laczniki = new SolidBrush(Color.Gray);
            Pen lacznikipen = new Pen(Color.Gray, 5);
            SolidBrush funkcja = new SolidBrush(Color.Green);
            Pen funkcjapen = new Pen(Color.Green, 5);
            SolidBrush zdarzenie = new SolidBrush(Color.Red);
            Pen zdarzeniepen = new Pen(Color.Red, 5);
            SolidBrush strzalka = new SolidBrush(Color.Black);
            Graphics rysujem = panel1.CreateGraphics();


            foreach (KeyValuePair<int, baza> luskanie in Form1.naszalista)
            {

                if (baza.rodzaj == "funkcja")
                {
                    rysujem.FillEllipse(funkcja,20,20,40,20);
                    rysujem.DrawString(funkcjazdarzenie.opis, new Font("Segoe", 9), Brushes.Green, 20, 20);
                }
                else if (baza.rodzaj == "zdarzenie")
                {
                    rysujem.FillPie(zdarzenie,20,20,20,20,20,20);
                }
                else if (baza.rodzaj == "XOR")
                {

                }
                else if (baza.rodzaj == "OR")
                {

                }
                else if (baza.rodzaj == "AND")
                {

                }
            }
        }
    }
}
现在,继承baza的类有一个构造函数和一个新字符串opis=,其中包含描述动作的文本。例如“老板需要签署文件”

XOR/OR/并且在插图上有相同的符号,它将是圆,但是它们之间的差异将在形状中间的文本中,如类的名称,将是XOR/OR///P>

public class xor : baza //klasa odpowiedzialna za xora 
{
    public xor(string krodzaj,int kidpoprzedniego)
    {
        rodzaj = krodzaj;
        idpoprzedniego = kidpoprzedniego;
    }


}

public class or : baza //klasa odpowiedzialna za ora 
{
    public or(string krodzaj,int kidpoprzedniego)
    {
        rodzaj = krodzaj;
        idpoprzedniego = kidpoprzedniego;
    }

}

public class and : baza // klasa odpowiedzialna za and 
{
    public and(string krodzaj,int kidpoprzedniego)
    {
        rodzaj = krodzaj;
        idpoprzedniego = kidpoprzedniego;
    }
}

要在两个表单之间发送值,您可以

  • 在第二种形式的构造函数中发送值。您可以创建参数化构造函数,并在初始化表单时发送值
  • 您可以在第二份表格中引用您的第一份表格:
  • 在第二种形式中

    public Form1 objForm1;
    
    在第一种形式中

    Form2 objForm2=new Form2();
    Form2.objForm1=this;
    
    然后您可以使用Form2的objForm1将Form1的字典项引用为

    //Form1.Dict_Name=values;
    

    您已将Form1中的字典设置为静态,并且正在从Form2中正确访问它。问题在您的For循环中。“luskanie”变量表示KeyValuePair,因此您应该使用它来访问“rodzaj”成员

    因此,不是:

    if (baza.rodzaj == "funkcja")
    
    你应该:

    if (luskanie.Value.rodzaj == "funkcja")
    
    总之,你可以让它看起来像:

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            SolidBrush laczniki = new SolidBrush(Color.Gray);
            Pen lacznikipen = new Pen(Color.Gray, 5);
            SolidBrush funkcja = new SolidBrush(Color.Green);
            Pen funkcjapen = new Pen(Color.Green, 5);
            SolidBrush zdarzenie = new SolidBrush(Color.Red);
            Pen zdarzeniepen = new Pen(Color.Red, 5);
            SolidBrush strzalka = new SolidBrush(Color.Black);
            Graphics rysujem = panel1.CreateGraphics();
    
    
            foreach (KeyValuePair<int, baza> luskanie in Form1.naszalista)
            {
                baza bz = luskanie.Value;
    
                if (bz.rodzaj == "funkcja")
                {
                    rysujem.FillEllipse(funkcja, 20, 20, 40, 20);
                    rysujem.DrawString(funkcjazdarzenie.nazwa, new Font("Segoe", 9), Brushes.Green, 20, 20);
                }
                else if (bz.rodzaj == "zdarzenie")
                {
                    rysujem.FillPie(zdarzenie, 20, 20, 20, 20, 20, 20);
                }
                else if (bz.rodzaj == "XOR")
                {
    
                }
                else if (bz.rodzaj == "OR")
                {
    
                }
                else if (bz.rodzaj == "AND")
                {
    
                }
            }
        }
    
    private void panel 1_Paint(对象发送器,PaintEventArgs e)
    {
    SolidBrush laczniki=新的SolidBrush(颜色为灰色);
    Pen lacznikipen=新笔(颜色为灰色,5);
    SolidBrush funkcja=新的SolidBrush(颜色为绿色);
    Pen funkcjapen=新笔(颜色:绿色,5);
    SolidBrush zdarzenie=新的SolidBrush(颜色为红色);
    Pen zdarzeniepen=新笔(颜色:红色,5);
    SolidBrush strzalka=新的SolidBrush(颜色为黑色);
    Graphics rysujem=panel1.CreateGraphics();
    foreach(表1.naszalista中的KeyValuePair luskanie)
    {
    baza bz=luskanie.值;
    如果(bz.rodzaj==“funkcja”)
    {
    rysujem.FillEllipse(funkcja,20,20,40,20);
    拉丝(funkcjazdarzenie.nazwa,新字体(“Segoe”,9),画笔。绿色,20,20);
    }
    else if(bz.rodzaj==“zdarzenie”)
    {
    rysujem.FillPie(zdarzenie,20,20,20,20,20);
    }
    else if(bz.rodzaj==“XOR”)
    {
    }
    如果(bz.rodzaj==“或”)
    {
    }
    else if(bz.rodzaj==“AND”)
    {
    }
    }
    }
    
    你有没有提到另一个表单,然后调用那个表单?你应该认真考虑阅读一些“编码约定”。我建议你开始。你打算使用MDI表格吗?如果您实际上应该只使用一个表单,而使用UserControls类型。@GrzegorzW我将在睡觉前阅读此内容,因为我认为这将在将来有所帮助;)@马可·泰克斯,我看看是什么。也许我会在这个应用程序中。谢谢回答和清楚的解释。是的,循环的某些操作是以错误的方式完成的,但是如果(bz.rodzaj==“funkcja”)“\u 1dwa3.baza.rodzaj”不能通过实例引用访问,则我在此行中遇到错误;使用类型名来限定它,因此您已将“rodzaj”标记为static,这意味着它在所有实例中都具有相同的值,但使用Dictionary()表明您希望基于整型键关联它的不同值。删除static关键字。如果这没有意义,那么您需要更详细地解释类的设计以及它们与绘图的关系。在这篇评论的底部,我将添加我的类,并简要说明。是的,我想从字典中提取描述对象的值。例如,用户选择Funkcja对象来描述“文档在办公室”,按下按钮转到图表,在第二个窗体上,我们应该看到中间的文本“椭圆文件”。.现在我没有任何错误,但我不能接受字符串nazwa,因为它不在baza类中,而是在继承自baza的“funkcjazdzarzenie”类中。我在问题的底部添加了类,如果没有清楚描述,请pliz说出来。当我想要放置来自不同类的对象时,唯一链接它们的是来自baza的继承。字典应该是baza类型,就像我在应用程序中使用的那样?是的,字典的值类型可以是baza类型。您可以检查值的类型,并根据需要将其转换为派生类型。对于您发布的其他类,“if(bz.rodzaj==“funkcja”)”不应该给出您提供的错误。您发布的内容与项目中实际拥有的内容之间存在脱节。
    if (luskanie.Value.rodzaj == "funkcja")
    
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            SolidBrush laczniki = new SolidBrush(Color.Gray);
            Pen lacznikipen = new Pen(Color.Gray, 5);
            SolidBrush funkcja = new SolidBrush(Color.Green);
            Pen funkcjapen = new Pen(Color.Green, 5);
            SolidBrush zdarzenie = new SolidBrush(Color.Red);
            Pen zdarzeniepen = new Pen(Color.Red, 5);
            SolidBrush strzalka = new SolidBrush(Color.Black);
            Graphics rysujem = panel1.CreateGraphics();
    
    
            foreach (KeyValuePair<int, baza> luskanie in Form1.naszalista)
            {
                baza bz = luskanie.Value;
    
                if (bz.rodzaj == "funkcja")
                {
                    rysujem.FillEllipse(funkcja, 20, 20, 40, 20);
                    rysujem.DrawString(funkcjazdarzenie.nazwa, new Font("Segoe", 9), Brushes.Green, 20, 20);
                }
                else if (bz.rodzaj == "zdarzenie")
                {
                    rysujem.FillPie(zdarzenie, 20, 20, 20, 20, 20, 20);
                }
                else if (bz.rodzaj == "XOR")
                {
    
                }
                else if (bz.rodzaj == "OR")
                {
    
                }
                else if (bz.rodzaj == "AND")
                {
    
                }
            }
        }