Как получить доступ к управлению формой из метода ToString вложенной структуры - PullRequest
1 голос
/ 30 ноября 2010

Я создаю небольшое приложение для Windows в C #.В коде формы я определяю открытую структуру с помощью метода ToString, который должен строить часть своего вывода из элементов в comboBoxes в той же форме.Это не похоже на трудность

public partial class Form1 : Form
{
 public struct OrderLineItem
    {
     string someString;
     int index;
     string ToString()
        {return someString + ActiveForm.sizeComboBox.Items[index].ToString();}  
    }
}

Он жалуется, что не может найти определение sizeComboBox.Если я явно использую имя формы, оно говорит, что для статического поля требуется ссылка на объект ... Я не совсем уверен, что это значит.Использование this.sizeComboBox относится к структуре, а не к форме.Используя просто sizeComboBox, снова требуется ссылка на объект.

Ответы [ 4 ]

0 голосов
/ 30 ноября 2010

Вам нужно разыграть ActiveForm до Form1.

Что-то вроде этого, я думаю (сейчас не нужно открывать VS, чтобы проверить):

return someString + ((Form1)ActiveForm).sizeComboBox.Items[index].ToString();

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

0 голосов
/ 30 ноября 2010

Предположим, что другая форма - Form2, которую вы можете разыграть ActiveForm в Form2:

var form2 = ActiveForm as Form2;
if (form2 != null) // form2 == null if ActiveForm is not of type Form2.
{
    form2.sizeComboBox...
}

Редактировать:
Две ноты.*

Вместо того, чтобы получать ActiveForm, лучше хранить form2 в переменной-члене в form1 при создании form2. Вы должны инкапсулировать получение значений комбинированного списка за свойством в Form2, например SelectedFooValue.
0 голосов
/ 30 ноября 2010
    public partial class Form1 : Form
{
    internal static Form1 ActiveForm { get; set; }

    public Form1()
    {
        InitializeComponent();
        ActiveForm = this;
    }

    public struct OrderLineItem
    {
        public override string ToString()
        {
            return ActiveForm.sizeComboBox.Items[index].ToString();
        }
    }

Однако учтите, что это неправильный подход. Может быть, вы можете опубликовать то, что вы пытаетесь достичь, и мы можем помочь?

0 голосов
/ 30 ноября 2010

Структура знает о своем содержащем классе тип , но не знает ни о каком конкретном экземпляре этого типа, если вы не укажете это.Например, вы можете создать конструктор, который принимает объект Form1, и он может сохранить ссылку на эту форму в переменной члена.

public partial class Form1 : Form 
{ 
 public struct OrderLineItem 
    { 
     string someString; 
     int index; 
     Form1 parentForm;

     internal OrderLineItem(Form1 parentForm)
     {
         this = new OrderLineItem();
         this.parentForm = parentForm;
     }

     string ToString() 
     {
         if (parentForm == null)
             return string.Empty;
         else
             return someString + parentForm.sizeComboBox.Items[index].ToString();
     }   
    } 
} 

Тем не менее, это серьезно сомнительный дизайн.

Многоуровневая структура этого приложения выглядит перевернутой.Объекты order-line-item должны существовать на более низком уровне, чем уровень пользовательского интерфейса.Пользовательский интерфейс иногда может видеть бизнес-объекты (заказ, элемент строки заказа и т. Д.), Но бизнес-объекты не должны ничего знать о пользовательском интерфейсе.

Если вы можете инвертировать эту структуру, он сделаеткод намного чище.

...