Как получить доступ к методам формы и средствам управления от класса в C#?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
25
задан Gustavo Mori 3 June 2011 в 18:12
поделиться

6 ответов

Вы пытаетесь получить доступ к классу в противоположность объекту. Тот оператор может сбивать с толку новичков, но Вы эффективно пытаетесь открыть свою дверь дома путем взятия двери на планах дома.

, Если Вы на самом деле хотели получить доступ к компонентам формы непосредственно от класса (который Вы не делаете) Вы использовали бы переменную, которая инстанцирует Вашей формы.

, В зависимости от которого пути Вы хотите пойти, Вы были бы лучше или отправки текста управления или безотносительно к методу в Ваших классах, например,

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

или представление свойств на Вашем классе формы и установке текста формы там - например,

string SomeProperty
{
   get 
   {
      return textBox1.Text;
   }
   set
   {
      textBox1.Text = value;
   }
}
29
ответ дан JamesSugrue 28 November 2019 в 18:29
поделиться

Другое решение состояло бы в том, чтобы передать текстовое поле (или управление, которое Вы хотите изменить) в метод, который будет управлять им в качестве параметра.

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 28 November 2019 в 18:29
поделиться
  1. у Вас должна быть ссылка на объект формы для доступа к его элементам
  2. , элементы должны быть объявлены, общественность для другого класса для доступа к ним
  3. не делают этого - класс должен знать слишком много о том, как форма реализована; не представьте средства управления формой за пределами класса
  4. формы вместо этого, обнародуйте свойства на Вашей форме для получения/устанавливания значений, Вы интересуетесь
  5. сообщение больше деталей того, что Вы хотите и почему, это кажется, что можно препятствовать в направлении, которое не согласовывается с хорошими методами инкапсуляции
9
ответ дан Steven A. Lowe 28 November 2019 в 18:29
поделиться

Необходимо получить доступ к объекту...., Вы не можете просто спросить класс формы....

, например,

Вы были бы сделанных некоторая вещь как

Form1.txtLog.Text = "blah"

вместо

Form1 blah = new Form1();
blah.txtLog.Text = "hello"
3
ответ дан Keith Nicholas 28 November 2019 в 18:29
поделиться

Необходимо сделать участников в для класса формы или общественность или, если класс обслуживания находится в том же блоке, внутреннем. Видимостью средств управления Windows можно управлять через их свойства Modifiers.

Примечание, что это обычно полагало, что плохая практика явно связывает класс обслуживания с классом UI. Скорее необходимо создать хорошие интерфейсы между классом обслуживания и классом формы. Однако для изучения или просто обычно бездельничания, земля не отделит свою ось, если Вы представите участников формы для классов обслуживания.

армированный пластик

1
ответ дан rp. 28 November 2019 в 18:29
поделиться

Если форма запускается первой, в обработчике загрузки формы мы можем создать копию нашего класса. У нас могут быть свойства, которые ссылаются на любые элементы управления, на которые мы хотим ссылаться. Передайте ссылку на форму 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
ответ дан 28 November 2019 в 18:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: