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