私はC#プログラムに取り組んでおり、現在1つのForm
といくつかのクラスがあります。クラスからForm
コントロール(TextBox
など)にアクセスできるようにしたいと思います。クラスのTextBox
のテキストを変更しようとすると、次のエラーが表示されます。
非静的フィールド、メソッド、またはプロパティ 'Project.Form1.txtLog'にはオブジェクト参照が必要です
クラスの1つからForm1.cs
にあるメソッドとコントロールにアクセスするにはどうすればよいですか?
オブジェクトではなくクラスにアクセスしようとしています。その声明は初心者には分かりにくいかもしれませんが、あなたは家の計画のドアを手に取って家のドアを開けようとしています。
実際にクラスからフォームコンポーネントに直接アクセスする場合(アクセスしない場合)、フォームをインスタンス化する変数を使用します。
どちらの方法にしたいかによって、コントロールのテキストを送信するか、クラスのメソッドに何かを送信する方が良いでしょう。
public void DoSomethingWithText(string formText)
{
// do something text in here
}
または、フォームクラスのプロパティを公開し、そこにフォームテキストを設定します-例
string SomeProperty
{
get
{
return textBox1.Text;
}
set
{
textBox1.Text = value;
}
}
別の解決策は、テキストボックス(または変更するコントロール)をパラメーターとして操作するメソッドに渡すことです。
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";
}
}
オブジェクトにアクセスする必要があります。..フォームクラスに単純に問い合わせることはできません。
例えば...
あなたは次のようなことをしたでしょう
Form1.txtLog.Text = "blah"
の代わりに
Form1 blah = new Form1();
blah.txtLog.Text = "hello"
フォームが最初に起動する場合、フォームロードハンドラーでクラスのコピーをインスタンス化できます。参照するコントロールを参照するプロパティを持つことができます。フォーム「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();
}
}
フォームクラスのメンバーをパブリックにするか、サービスクラスが同じアセンブリにある場合は内部にする必要があります。 Windowsコントロールの可視性は、Modifiersプロパティを介して制御できます。
一般に、サービスクラスをUIクラスに明示的に関連付けることは悪い習慣と見なされていることに注意してください。むしろ、サービスクラスとフォームクラスの間に適切なインターフェイスを作成する必要があります。とは言っても、学習や一般的な混乱のために、サービスクラスのフォームメンバーを公開しても、地球はその軸から外れることはありません。
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);
私のために働いた、多分それは両方の質問の助けになるでしょう。
このようにクラスにフォームを送信できます
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として宣言していることを忘れてはなりません。そうしないと、クラスのフォームにコントロールが表示されません。