2013-05-01 99 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;