2013-05-01 66 views
0

我以第一种形式创建对象并将其添加到字典中。 我想以第二种形式搜索它,因为我想根据第一种形式创建的对象在面板上绘制标志。2种形式之间的连接

我看到这个 topic但我不知道,我如何添加一个构造函数到Form2,它将一个Form作为参数?

我试图做单身字典,但我也不知道如何得到从字典在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") 
       { 

       } 
      } 
     } 
    } 
} 

THX任何意见,我试图让这个问题具体。

我加入这里,也是个教学班,不久描述

public class baza /* this is superior class, it contains rodzaj = which give me opportunity, to know which shape shold be printed, idpoprzedniego give me chance to know after which shape it should be printed */ 
{ 
    public string rodzaj; 
    public int idpoprzedniego; 

} 

现在它继承自巴扎,它有一个构造器,并有新的字符串OPIS类=包含文字描述的动作。例如“老板需要签署的文件”

public class funkcjazdarzenie : baza //   
{ 
    public string opis; 
    public funkcjazdarzenie(string krodzaj, string kopis, int kidpoprzedniego) 
    { 
     rodzaj = krodzaj; 
     idpoprzedniego = kidpoprzedniego; 
     opis = kopis; 
    } 

} 

异或/和/或对说明它会圆这个符号相同,但它们之间的差异将在文中形状的中间一样的类的名称将是XOR /或/和

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; 
    } 
} 
+0

你有没有做一个参考其他形式,然后调用该表单? – 2013-05-01 15:12:35

+1

你应该认真考虑阅读一些'编码约定'。我建议你开始[这里](http://msdn.microsoft.com/en-us/library/vstudio/ff926074.aspx)。 – 2013-05-01 15:19:30

+0

你打算使用MDI表单吗?如果你实际上只有一种形式,并使用UserControls类型。 – Marco 2013-05-01 15:22:47

回答

0

您已经使Form1中的Dictionary为静态,并且正在从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") 
      { 

      } 
     } 
    } 
+0

Thx用于回答和明确解释。是的东西与循环是以错误的方式完成,但现在我有错误我这一行如果(bz.rodzaj ==“funkcja”)'_1dwa3.baza.rodzaj'无法访问与实例引用;使用类型名称代替它 – whyworry 2013-05-02 11:27:05

+0

因此,您已将“rodzaj”标记为静态,这意味着它在所有实例中都具有**相同的**值,但对Dictionary()的使用表明您希望关联**不同**基于整数键的值。删除静态关键字。如果这样做没有意义,那么您需要更详细地解释类的设计以及它们与绘图的关系。 – 2013-05-02 12:26:07

+0

在这个评论的底部,我将添加我的类和简短的描述。是的,我想从字典中获取描述对象的值。例如,用户选择描述“文档在办公室”的funkcja对象并按下按钮转到图表,在第二个窗体上,我们应该看到带有文本的椭圆在中间的“文件在办公室”。现在我没有任何错误,但我不能接受字符串nazwa,因为它不是在类baza,但在班级“funkcjazdzarzenie”,从巴扎继承。 – whyworry 2013-05-02 13:33:47

0

对于两种形式之间发送的值,你可以

  1. 发送第二形式的构造函数的值。您可以创建一个参数化构造函数,并在初始化表单时发送值。
  2. 您可能需要参考您的第一个形式,第二种形式为:

在第二种形式,

public Form1 objForm1; 

,并在第一种形式

Form2 objForm2=new Form2(); 
Form2.objForm1=this; 

,然后您可以使用Form2的objForm1来引用Form1的字典项目为

//Form1.Dict_Name=values;