2013-12-06 5 views
0

, работающий над методом входа, используя Mdi и MVC. Структура класса очень сложная, поэтому необходимы постоянные ссылки между классами. Однако, когда я пытаюсь изменить вид главного меню, я получаю «ссылка на объект требуется для нестатического поля, метода или свойства».Ссылка на объект требуется для нестатического поля, метода или свойства

Я все еще только любитель, начал 2 месяца назад и самоучка, поэтому я все еще неясен в отношении того, что на самом деле имеет в виду ошибка и что это значит.

Вот меню View Класс:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using DCIM_With_Test.User; 

namespace DCIM_With_Test.Menu 
{ 
    public partial class Menu_View : Form 
    { 
     public static int btnUser; 

     public Menu_View() 
     { 
      InitializeComponent(); //runs the Main Menu form 
      User_Controller CreateLoginView = new User_Controller(); //opens the Show_Login method in the User_Controller 
      CreateLoginView.Show_Login(this); //sets the Mdi Parent container 
     } 

     public void SetMenuView() 
     { 
      switch (Db_Facade.ACCESS) 
      { 
       case 1: 
        plantAreaCodeToolStripMenuItem.Visible = true; 
        cableIDToolStripMenuItem.Visible = true; 
        logOutToolStripMenuItem.Visible = true; 
        createNewUserToolStripMenuItem.Visible = true; 
        editUserToolStripMenuItem.Visible = true; 
        break; 
       default: 
        plantAreaCodeToolStripMenuItem.Visible = false; 
        cableIDToolStripMenuItem.Visible = false; 
        logOutToolStripMenuItem.Visible = false; 
        createNewUserToolStripMenuItem.Visible = false; 
        editUserToolStripMenuItem.Visible = false; 
        break; 
      } 
     } 

Контроллер Пользователь:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using DCIM_With_Test.Menu; 

namespace DCIM_With_Test.User 
{ 
    class User_Controller 
    { 
     public void Show_Login(Menu_View Main_Menu) 
     { 
      User_Login_View LoginView = new User_Login_View(); // Creates an object of the User_Login_View. 
      LoginView.MdiParent = Main_Menu; // Set the Parent Form of the Child window. 
      LoginView.Show(); // Display the new form. 
     } 

     public void Show_User(Menu_View Main_Menu) 
     { 
      User_Edit_View EditUserView = new User_Edit_View(); // Creates an objet of the User_View. 
      EditUserView.MdiParent = Main_Menu; // Set the Parent Form of the Child window. 
      EditUserView.Show(); // Display the new form. 
     } 

     public static void Compare_Login(User_Login_View Login_View) 
     { 
      User_Model getACCESS = new User_Model(); 
      getACCESS.uName = Login_View.txtUsername.Text; 
      getACCESS.uPwd = Login_View.txtPassword.Text; 

      Db_Facade.ACCESS = 1; 

      if (Db_Facade.ACCESS > 0) 
      { 
       Login_View.Close(); 
      } 
      else 
      { 
       Login_View.lblError.Visible = true; 
      } 

      Menu_View.SetMenuView(); //here is where the error occurs 
     } 
    } 
} 

Db_Facade класса в настоящее время просто набор переменных, следовательно, почему ACCESS устанавливается в 1 в User_Controller

ответ

1

Ваша проблема возникает, потому что у вас нет ссылки на объект Menu_View i nside your function, поэтому он пытается ссылаться на класс Menu_View, класс, который не имеет назначенных статических элементов. Похоже, что вы хотите сделать, это вызов Login_View.MdiParent.SetMenuView()

EDIT

Вы, вероятно, нужно, чтобы бросить вызов, как вы спасаете Main_Menu в LoginView.MdiParent, который хранит его как это базовый класс Form. Попробуйте: (Main_Menu)Login_View.MdiParent.SetMenuView()

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

В вашем User_Login_View, создайте новый объект public Menu_View Menu {get;set;}. Затем в вашей функции Show_Login добавьте строку, чтобы установить объект MenuLoginView Menu = Main_Menu;. Теперь вы можете ссылаться на LoginView.Menu.SetMenuView();, не требуя приведения.

+0

хорошо, что отсортировал эту проблему, но теперь у меня есть еще один: «System.Windows.Forms.Form» не содержит определения для «SetMenuView» и никакого метода расширения «SetMenuView», принимающего первый аргумент типа ' System.Windows.Forms.Form '(вам не хватает директивы using или ссылки на сборку?) – Ben

+0

На самом деле у меня возникла мысль. Могу ли я поместить вызов «SetMenuView» другим способом, который содержит ссылку на главное меню и доступ к нему таким образом? Или ссылка на Menu_View все еще мешает? – Ben

+0

Основная проблема заключается в том, что вы храните переменную для будущего использования. Когда вы создаете переменную, вы устанавливаете тип, который, как вы ожидаете, будет храниться в нем. Например, 'MdiParent' определяется как тип' Form'. Вы можете сохранить объект в этой переменной, если он определяет эту подпись где-нибудь в дереве наследования. Когда вы его извлекаете, Тип, который он хранил, сообщает, что ** прямо ** доступно для этого объекта. Вам нужно будет передать объект для доступа к свойствам или методам дальше по цепочке. Или вы можете создать свойство, специально предназначенное для хранения объекта как типа «Main_Menu». – Claies