2017-07-21 70 views
0

我忽略了一些我認爲簡單的東西。我有一個複選框的表單。我需要知道是否在不同的cs文件/類中檢查複選框以知道是否創建列標題Option1或Option2。
Form1的(公共部分類)代碼:在另一個.cs文件中引用的靜態

public bool Checked 
{ 
    get 
    { 
     return checkBox1.Checked; 
    } 
} 

在我EXPORT1類我有私人無效CreateCell1這需要在數據導出(從創建一個DataTable一個Excel文件)。的代碼,我不能去工作的部分是:

if (Form1.Checked.Equals("true")) 
{ 
    newRow["Option1"] = date2; 
} 
else 
{ 
    newRow["Option2"] = date2; 
} 

我越來越 - 錯誤1一個對象引用是必需的非靜態字段,方法或屬性「Matrix1.Form1.Checked.get '

我忽略了什麼?

+0

'Form1'是類的名字 - 你需要一個實際的對象(因爲'Checked'不是'static') – UnholySheep

回答

0

無論如何,您需要訪問您要檢查的Form1的特定實例。

幾個方法可以做到這一點是:

  1. 傳遞實例類的構造函數
  2. 其他類的公共屬性設置爲形式
  3. 的實例傳遞的實例的方法直接

例如:

public class SomeOtherClass 
{ 
    // One option is to have a public property that can be set 
    public Form1 FormInstance { get; set; } 

    // Another option is to have it set in a constructor 
    public SomeOtherClass(Form1 form1) 
    { 
     this.FormInstance = form1; 
    } 

    // A third option would be to pass it directly to the method 
    public void AMethodThatChecksForm1(Form1 form1) 
    { 
     if (form1 != null && form1.Checked) 
     { 
      // Do something if the checkbox is checked 
     } 
    } 

    // This method uses the local instance of the Form1 
    // that was either set directly or from the constructor 
    public void AMethodThatChecksForm1() 
    { 
     AMethodThatChecksForm1(this.FormInstance); 
    } 
} 

這個類將需要通過使用這些方法中的一個實例form1被實例化:

// Pass the instance through the constructor 
var someOtherClass = new SomeOtherClass(this); 

// Or set the value of a property to this instance 
someOtherClass.FormInstance = this; 

// Or pass this instance to a method of the class 
someOtherClass.AMethodThatChecksForm1(this); 
4

好了,這裏的問題是什麼,編譯器告訴你。您需要對象引用才能訪問該屬性。

請允許我解釋一下。

在C#中,默認情況下,類成員(字段,方法,屬性等)是實例成員。這意味着它們與他們所屬課程的實例相關聯。這使行爲像下面這樣:

public class Dog 
{ 
    public int Age { get; set; } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     var dog1 = new Dog { Age: 3 }; 
     var dog2 = new Dog { Age: 5 }; 
    } 
} 

Dog雙方的兩個實例具有這樣的性質Age,但是價值是聯繫在一起的Dog該實例,這意味着它們可以爲每一個不同的。

在C#中,和許多其他語言一樣,有些東西叫static類的成員。當一個類成員被聲明爲static時,那麼該成員不再與它所屬類的一個實例綁定。這意味着,我可以做類似如下:

public class Foo 
{ 
    public static string bar = "bar"; 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine(Foo.bar); 
    } 
} 

Foo類的bar字段聲明static。這意味着Foo的所有實例都是相同的。實際上,我們甚至不需要初始化Foo的新實例來訪問它。

您在這裏面臨的問題是,雖然Form1不是靜態類,Checked不是靜態屬性,但您將其視爲同等對待。爲了使您正在嘗試工作,您需要創建一個實例Form1並訪問該實例的Checked屬性。

根據您的程序結構的不同,有很多方法可以做到這一點。如果Form1在您嘗試訪問Checked的範圍內創建,那麼這將很簡單。如果Form1是產生新範圍的東西,那麼通常的做法是在構造函數中傳遞對它的引用。

例如,如果Form1創建一個新的Form2那麼我們做到以下幾點:

public class Form2 : Form 
{ 
    private Form1 parent; 
    public Form2(Form1 parent) 
    { 
     this.parent = parent; 
     InitializeComponent(); 
    } 
} 

然後你就可以在整個Form2訪問parent。當然,根據程序的結構,確切的實現將有所不同。但是,一般模式是一樣的。將參考Form1從創建的範圍傳遞到新類,然後從那裏訪問它。

相關問題