2012-04-23 4 views
0

Я работаю над программой в C#, которая использует свой список в качестве метода выбора в своей основной форме. Он имеет функции, в которых вы можете редактировать элементы в списке.Доступ к функциям из других форм

Я хотел отредактировать элементы из отдельной выделенной формы, поэтому я сделал новый экземпляр формы, но всякий раз, когда я пытаюсь получить доступ к функциям оригинальной формы (которые я обнародовал), я получаю эту ошибку: Ошибка 2 Ссылка на объект требуется для нестатического поля, метода или свойства

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

Вот функция в Form1 (который я пытаюсь ссылаться)

public void ReadConfig(string configFile) 
    { 
     fileList.Clear(); 
     listBoxName.Items.Clear(); 
     FileStream file = null; 

     if (!File.Exists(file)) 
     { 
      MessageBox.Show(file + " was not found: Creating blank file"); 
      using (file = File.Create(file)) ; 
     } 
     else 
     { 
      string line; 
      int lineNumber = 1; 

      // I cut out some long code here where the program reads from a file and saves it to an object 
     } 
    } 

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

 private void buttonSave_Click(object sender, EventArgs e) 
    { 
     string[] temp = File.ReadAllLines(Form1.file); 
     string[] newFile; 

     if (itemNew == true) 
     { 
      newFile = new string[temp.Length + 1]; 
     } 
     else 
     { 
      newFile = new string[temp.Length]; 
     } 

     for (int i = 0; i < temp.Length; i++) 
     { 
      newFile[i] = temp[i]; 
     } 
     File.WriteAllLines(Form1.file, newFile); 
     ConfigForm.ReadFile(Form1.file); 


     this.Close(); 
    } 

Я надеюсь, что это достаточно код ушел. Моя программа довольно длинная, поэтому я старался держать ее как можно короче и прямой, так как p жно. Спасибо, что терпеливы со мной =]

Я довольно новичок в программировании, поэтому, если какие-либо души помогут вам сохранить это как можно проще?

Спасибо большое =]

+0

язык программирования Что? – JohnFx

+0

C#. Извините, забыли, что =] –

+1

Хорошо. Теперь покажите свой код, где вы получаете ошибку. Мы не можем читать ваш экран через Интернет. – JohnFx

ответ

1

Возможно, это связано с тем, что вы пытаетесь использовать функции, которые существуют в вашем первом окне, из второго, как если бы они были статическими, но это не так.

Вы можете попытаться решить эту проблему таким образом:

  • в второй форме создать свойство с классом вашей первой формы, как:

    class Form1 : Form 
    { 
        //this property will store reference to the first form 
        public Form1 AssociatedFirstForm { get; set; } 
        //... 
    } 
    
  • Тогда в код, в котором вы создаете вторую форму, назначьте первую форму этому свойству, которое может выглядеть так (если вы создаете вторую форму из первой):

    ... 
    Form2 secondForm = new Form2(); 
    secondForm.AssociatedFirstForm = this; 
    ... 
    

или как это (если вы создаете обе формы из другой части кода):

... 
    Form1 firstForm = new Form1(); 
    Form2 secondForm = new Form2(); 
    secondForm.AssociatedFirstForm = firstForm; 
    ... 
  • затем, в вашем второй форме вы должны быть в состоянии назвать метод из первой формы:

    ... 
    var myResultFromAnotherWindow = this.AssociatedFirstForm.SampleMethodToCall(); 
    ... 
    

Я полагаю, что вы также должны ознакомиться с использованием static classes and class members и creating instances of objects. Это должно дать вам понять, как и когда их использовать.

Update

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

Если вы хотите создать хорошую структуру кода в своем приложении и узнать, как это должно быть сделано, найдите некоторые статьи об объектно-ориентированном программировании.

Некоторые примеры ссылок:

Знающие ТРОЕБОРЬЕ механизм также может быть полезным: http://msdn.microsoft.com/en-us/library/awbftdfh.aspx.

+0

Итак, я понимаю, что это для новичка, но в целом «Держите ссылку к основной форме и сделать все методы общедоступными »- это анти-шаблон, если я когда-либо видел его. Лучшее решение будет использовать события, чтобы сигнализировать родительской форме о том, что что-то произошло, что позволяет ему обновлять свое состояние по мере необходимости в ответ. Я просто не могу дать это upvote, как это написано в настоящее время. –

+0

Я пробовал это, но теперь у меня другая ошибка. На этот раз это Ошибка Элемент был указан более одного раза в параметре «Ресурсы». Параметр «Ресурсы» не поддерживается повторяющимися элементами. \t Я положил связанный класс на самый верх, чуть выше открытый частичный класс Form2: Форма Я не уверен, что это подходящее место, но оно избавилось от исходной ошибки. Большое спасибо за помощь до сих пор =] –

+0

@Ed S .: Я не говорю, чтобы все методы были общедоступными, потому что, как вы уже сказали, это было бы против концепции объектно-ориентированного программирования. Однако, если метод (или свойство) является особой вещью, которую делает форма, он может публиковать ее как общедоступную, поэтому другая форма (т. Е. Ее родительская форма) может использовать ее (например, чтение 'FileName' из формы OpenFileDialog). Возможно, я должен был написать, чтобы не злоупотреблять публичными членами публики в ответ. –

0

Вы метод по типу вызова не на экземпляре типа. Когда методы не объявляются как статические, вам необходимо сначала создать объект, содержащий эти методы (используя новый).

0

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

Форма 1

public Form1() 
    { 
     InitializeComponent(); 
    } 

    List<string> _items = new List<string>(); 

    public void LoadListBoxWithItems() 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      _items.Add(string.Format("My New Item {0}", i)); 
     } 
     lbItems.DataSource = _items; 
     lbItems.Refresh(); 
    } 

    private void btnUpdate_Click(object sender, EventArgs e) 
    { 
      Form2 form2 = new Form2(); 
      form2.LoadValues(lbItems.SelectedItem.ToString(), this); 
      form2.ShowDialog(); 
    } 

    public string GetCurrentItem() 
    { 
     return lbItems.SelectedItem.ToString(); 
    } 

    public void UpdateItem(string item, string newitem) 
    { 
     int index = _items.IndexOf(item); 
     _items[index] = newitem; 
     lbItems.Refresh(); 
    } 

Форма 2

public Form2() 
    { 
     InitializeComponent(); 
    } 

    private string _originalvalue = null; 
    private Form1 _form1; 

    public void LoadValues(string item, Form1 form) 
    { 
     _originalvalue = item; 
     _form1 = form; 
    } 


    private void btnSave_Click(object sender, EventArgs e) 
    { 
     // Do work to change value 
     string newvalue = _originalvalue; 
     _form1.UpdateItem(newvalue, _originalvalue); 
    } 
+0

Почему XML-комментарии в примере кода? Тем более, что они еще не закончены. –

+0

@Peri Это привычка. Большинство из моего кода потребляются другими, и у меня есть определенный поток, за которым я следую. 1. Способ записи - как только я думаю, что он завершен - я добавляю раздел комментариев xml и ругаюсь. 2. Напишите все тесты против кода/рефактория/etc. Как только все тесты проходят, я возвращаюсь и заполняю комментарии/любые дополнительные примечания, которые необходимы до регистрации. – tsells

Смежные вопросы