web-dev-qa-db-ja.com

C#のクラスからフォームメソッドとコントロールにアクセスする方法は?

私はC#プログラムに取り組んでおり、現在1つのFormといくつかのクラスがあります。クラスからFormコントロール(TextBoxなど)にアクセスできるようにしたいと思います。クラスのTextBoxのテキストを変更しようとすると、次のエラーが表示されます。

非静的フィールド、メソッド、またはプロパティ 'Project.Form1.txtLog'にはオブジェクト参照が必要です

クラスの1つからForm1.csにあるメソッドとコントロールにアクセスするにはどうすればよいですか?

25
user13504

オブジェクトではなくクラスにアクセスしようとしています。その声明は初心者には分かりにくいかもしれませんが、あなたは家の計画のドアを手に取って家のドアを開けようとしています。

実際にクラスからフォームコンポーネントに直接アクセスする場合(アクセスしない場合)、フォームをインスタンス化する変数を使用します。

どちらの方法にしたいかによって、コントロールのテキストを送信するか、クラスのメソッドに何かを送信する方が良いでしょう。

public void DoSomethingWithText(string formText)
{
   // do something text in here
}

または、フォームクラスのプロパティを公開し、そこにフォームテキストを設定します-例

string SomeProperty
{
   get 
   {
      return textBox1.Text;
   }
   set
   {
      textBox1.Text = value;
   }
}
28
JamesSugrue

別の解決策は、テキストボックス(または変更するコントロール)をパラメーターとして操作するメソッドに渡すことです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass test = new TestClass();
        test.ModifyText(textBox1);
    }
}

public class TestClass
{
    public void ModifyText(TextBox textBox)
    {
        textBox.Text = "New text";
    }
}
14
Timothy Carter
  1. その要素にアクセスするには、フォームオブジェクトへの参照が必要です
  2. 別のクラスが要素にアクセスするには、要素をpublicとして宣言する必要があります
  3. これをしないでください-あなたのクラスはあなたのフォームがどのように実装されているかについて多くを知る必要があります;フォームクラスの外部にフォームコントロールを公開しない
  4. 代わりに、フォームにパブリックプロパティを作成して、関心のある値を取得/設定します
  5. あなたが望むものとその理由の詳細を投稿してください、あなたは良いカプセル化の慣行と一致しない方向に向かっているようです
9
Steven A. Lowe

オブジェクトにアクセスする必要があります。..フォームクラスに単純に問い合わせることはできません。

例えば...

あなたは次のようなことをしたでしょう

Form1.txtLog.Text = "blah"

の代わりに

Form1 blah = new Form1();
blah.txtLog.Text = "hello"
3
Keith Nicholas

フォームが最初に起動する場合、フォームロードハンドラーでクラスのコピーをインスタンス化できます。参照するコントロールを参照するプロパティを持つことができます。フォーム「this」への参照をクラスのコンストラクターに渡します。

public partial class Form1 : Form
{
    public ListView Lv
    {
        get { return lvProcesses; }
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Utilities ut = new Utilities(this);
    }
}

クラスでは、フォームからの参照がコンストラクターに渡され、プライベートメンバーとして保存されます。このフォーム参照を使用して、フォームのプロパティにアクセスできます。

class Utilities
{
    private Form1 _mainForm;
    public Utilities(Form1 mainForm)
    {
        _mainForm = mainForm;
        _mainForm.Lv.Items.Clear();
    }
}
2
Ojhnny777

フォームクラスのメンバーをパブリックにするか、サービスクラスが同じアセンブリにある場合は内部にする必要があります。 Windowsコントロールの可視性は、Modifiersプロパティを介して制御できます。

一般に、サービスクラスをUIクラスに明示的に関連付けることは悪い習慣と見なされていることに注意してください。むしろ、サービスクラスとフォームクラスの間に適切なインターフェイスを作成する必要があります。とは言っても、学習や一般的な混乱のために、サービスクラスのフォームメンバーを公開しても、地球はその軸から外れることはありません。

rp

1
rp.

私はc#が比較的新しく、stackoverflowが初めてです。とにかく、クラスからフォーム上のコントロールにアクセスする方法に関する質問に関しては、フォームのControlCollection(Controls)クラスを使用しました。

        //Add a new form called frmEditData to project.
        //Draw a textbox on it named txtTest; set the text to
        //something in design as a test.
        Form frmED =  new frmEditData();
        MessageBox.Show(frmED.Controls["txtTest"].Text);

私のために働いた、多分それは両方の質問の助けになるでしょう。

1
Jim

このようにクラスにフォームを送信できます

Class1 excell = new Class1 (); //you must declare this in form as you want to control

Excel.get_data_from_Excel(this); // And create instance for class and sen this form to another class

クラス1を作成する際のクラス内

class Class1
{
    public void get_data_from_Excel (Form1 form) //you getting the form here and you can control as you want
    {
        form.ComboBox1.text = "try it"; //you can chance Form1 UI elements inside the class now
    }
}

重要:ただし、モディファイヤフォームプロパティをPUBLICとして宣言していることを忘れてはなりません。そうしないと、クラスのフォームにコントロールが表示されません。

0
Toprak