2017-06-11 56 views
0

我的public partial class frmMain : Form我有private class Tile如何從一個類的實例訪問表單的文本框?

課內Tile我有private PictureBox pic = new PictureBox();

我已經註冊了這些pictureBoxes(在Tile類中)click事件:

public void Initialize() 
{ 
    pic.Click += new EventHandler(swap); 
} 

當我點擊一個PictureBox我希望能夠看到textbox1.Text。

private void swap(object sender, EventArgs e) 
{ 
    // code here // 
    if (won) 
    { 
     MessageBox.Show(textBox1.Text); 
    } 
} 

我該如何讓textbox1.Text和我的frmMain實例的其他字段可見?

+0

您是否將修飾符更改爲public TextBox1控件?另外,你有一個frmMain或單身frmMain的靜態實例嗎?這樣做應該可行。 – Nathangrad

+0

目前,如果您在交換方法中放置'MessageBox.Show(「some message」);'是否顯示帶有「某條消息」消息的消息框? –

+0

@ChetanRanpariya是的。 – AchiPapakon

回答

2

最快的解決辦法是通過frmMain作爲參數傳遞給瓷磚類。瓷磚類將是:

private class Tile { 
    private frmMain frm; 
    //constructor 
    public Tile(frmMain frm) { 
      this.frm = frm; 
    } 
    ... your code ... 
    //now you can 
    private void swap(object sender, EventArgs e) 
    { 
      if (won) 
      { 
       MessageBox.Show(frm.textBox1.Text); 
      } 
    } 
} 

請記住,textBox1必須從frmMain公開訪問。

最簡潔的解決方案是從frmMain公開接口並將其作爲參數傳遞給Tile類。

接口

public interface IfrmMain_GetText 
{ 
    string gettextBox1Text(); 
} 

frmMain

public partial class frmMain : Form, IfrmMain_GetText 
{ 
     ... your code ... 
     public string gettextBox1Text(){ 
      return textBox1.Text; 
     } 
} 

瓷磚類

private class Tile { 
     private IfrmMain_GetText frmInterface; 
     //constructor 
     public Tile(IfrmMain_GetText frmInterface) { 
       this.frmInterface = frmInterface; 
     } 
     ... your code ... 
     //now you can 
     private void swap(object sender, EventArgs e) 
     { 
       if (won) 
       { 
        MessageBox.Show(frmInterface.gettextBox1Text()); 
       } 
     } 
    } 
+0

只需從frmMain調用:Tile yourName = new Tile(this);並且將textBox1 public設置爲CodingYoshi提出。 –

1

如何使textbox1.Text和我的frmMain實例的其他字段可見?

在C#窗體中,控件默認爲private。要更改訪問修飾符,你可以像下面更改:

右鍵單擊控件>屬性>更改下拉列表如下圖所示

enter image description here

我將其更改爲internal,沒有必要在你的情況下公開。

這意味着控件所在類(frmMain)以外的類可以訪問該控件。但是你的班級需要參考frmMain,所以它可以訪問frmMain的控件。要做到這一點,您可以通過以下方式做到這一點:

選項1

您可以通過frmMain參考的構造函數的類:

public class SomeClass 
{ 
    private frmMain someForm; 
    public SomeClass(frmMain someForm) 
    { 
     this.frmMain = someForm; 
     // Now you can do this 
     var ctrl = this.frmMain.WhateverControlYouNeedToAccess; 
     string controlText = ctrl.Text; //assuming it has Text property 
    } 
} 

在創建SomeClass的,將您的表單傳遞給它:

// this reference to the current instance 
// this code will be in your form 
SomeClass some = new SomeClass(this); 

選項2

在你的班上有一個屬性,因此它是可設置從外面是這樣的:

public class SomeClass 
{ 
    public frmMain SomeForm { get; set; } 
} 

你會這樣設置屬性:

SomeClass some = new SomeClass(); 
some.SomeForm = this; 

選項3

只給班級最低限度的需求。你不需要給它一個參考整體形式,但只有一個控制(或更多),然後專門通過控制這樣的:

SomeClass some = new SomeClass(); 
some.PictureBoxA = this.pictureBox1; 
some.Button1 = this.button1; 

對於這個工作,你的類必須具有的屬性,以上。所以,你的類將有這類似:

public class SomeClass 
{ 
    public PictureBox PictureBoxA { get; set; } 
    public Button Button1 { get; set; } 
} 
+0

即使我將該屬性設置爲公共,它仍然不可見。 – AchiPapakon

+0

@Achilles看到我的完整答案。我有一個答案,你需要更多的解釋,所以我進一步闡述。 – CodingYoshi

1

您必須通過形狀參照嵌套類。你可以通過構造函數來完成。

private class Tile 
{ 
    private frmMain _frm; 

    public Tile (frmMain frm) 
    { 
     _frm = frm; 
    } 

    private void swap(object sender, EventArgs e) 
    { 
     if (won) { 
      MessageBox.Show(_frm.textBox1.Text); 
     } 
    } 
} 

你要麼需要做textBox1大衆或將其封裝在一個公共屬性。


更簡潔的方法是將信息保存在數據類中並使用對象綁定將其屬性綁定到文本框。然後,您可以將此數據對象傳遞給Tile類。

See on:A Detailed Data Binding Tutorial on CodeProject。

我不知道你的表單上顯示的是什麼樣的數據,但是如果顯示了瓦片數據,那麼Tile類可以充當數據類,並且可以將瓦片對象綁定到表單。

相關問題