Доступ к нестатическому свойству combbox в статическом методе

У меня есть одно поле со списком в форме окна, и у меня есть один метод, который объявлен статическим, например private static DataTable ParseTable(HtmlNode table) Теперь я хочу использовать поле со списком в этом методе для использования свойства поля со списком, но я не могу получить доступ к какому-либо свойству поля со списком или самого поля со списком. Если я сделал объявление combobox как статическое, тогда к нему можно получить доступ в этом статическом методе. Но любой альтернативный способ доступа к свойству combobox в этом статическом методе, потому что я не хочу делать объявление combobox статическим.


person Harikrishna    schedule 02.04.2010    source источник


Ответы (4)


Вы можете передать поле со списком в качестве параметра вашего метода. Почему вам нужно, чтобы метод ParseTable был статическим?

Обновление: вы не можете получить доступ к нестатическим членам класса в статическом контексте. Таким образом, единственное, что вы можете сделать, если вам все еще нужен статический метод, - это каким-то образом передать свое поле со списком этому методу, используя параметры метода.

person Andrew Bezzub    schedule 02.04.2010
comment
@Andrew Bezzub, этот метод вызывается часто, и я хочу повысить производительность приложения, поэтому я объявил метод статическим. - person Harikrishna; 02.04.2010
comment
@Harikrishna, я думаю, что это неподходящее место для оптимизации производительности. - person Andrew Bezzub; 02.04.2010
comment
@Andrew Bezzub, может быть почти десять полей со списком, и даже нет фиксированного количества полей со списком, которые могут быть в форме окна. - person Harikrishna; 02.04.2010
comment
@Andrew Bezzub, Адриан Фачу говорит, что используйте ключевое слово this, и вы сможете это сделать, но я не понимаю, как? - person Harikrishna; 02.04.2010
comment
@Harikrishna: У тебя только одна форма. Таким образом, объявление статического метода не приводит к улучшению производительности. - person AMissico; 02.04.2010
comment
@Harikrishna, я полагаю, что Эндрю считает, что если вы не можете понять, как использовать поля экземпляра в статическом методе, возможно, оптимизация производительности не должна быть на первом месте в вашем списке приоритетов. Вставьте здесь что-нибудь о том, что преждевременная оптимизация является корнем всех зол. - person Anthony Pegram; 02.04.2010

Вы можете получить доступ к выпадающему списку, передав «это» статическому методу и обратившись к любому элементу, который вам нужен, через «это».

person Adrian Fâciu    schedule 02.04.2010
comment
@ Харикришна, посмотри на мой ответ. За исключением того, что вместо получения TextBox, как в моем примере, вы получите объект типа вашей формы (Form1?). Затем вы можете вызвать эту функцию, используя this в качестве аргумента. После этого сама функция может получить доступ к доступным членам параметра. - person Anthony Pegram; 02.04.2010
comment
@Harikrishna, Энтони прав, это было бы то же самое, но вместо параметра TextBox у вас была бы форма. Если вам нужны только данные из текстового поля, вы должны пойти с этим, с этим вы можете получить доступ ко всем членам вашей формы. - person Adrian Fâciu; 02.04.2010

Вы не сможете просто получить доступ к члену экземпляра из статической функции. Один из способов получить доступ — передать элемент управления функции в качестве аргумента. Рассмотрим этот пример.

private void button1_Click(object sender, EventArgs e)
{
    Form1.DoSomething(textBox1);
}

public static void DoSomething(TextBox textbox)
{
    textbox.Text = DateTime.Now.ToString();
}
person Anthony Pegram    schedule 02.04.2010

Нет необходимости в статическом методе ParseTable в форме. Удалите static из этой функции, если вы хотите, чтобы эта функция взаимодействовала с элементами управления в форме.

Судя по комментариям, нет улучшения производительности, если у вас есть только одна форма. Если у вас есть несколько форм, вызывающих этот статический метод, то ParseTable следует переместить в отдельный статический класс.

Если вы загружаете десять или более полей со списком с помощью этого метода ParseTable, я предлагаю вам воспользоваться предложением Энтони Пеграма и Эндрю Беззуба и передать элемент управления ComboBox по мере необходимости. Я бы не стал передавать это (форму), потому что обычно это создает «уродливый» неуправляемый код.

person AMissico    schedule 02.04.2010