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

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

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

Вот класс представления меню:

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.


person Ben    schedule 06.12.2013    source источник


Ответы (1)


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

ИЗМЕНИТЬ

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

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

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

person Claies    schedule 06.12.2013
comment
ну, это решило эту проблему, но теперь у меня есть еще одна: «System.Windows.Forms.Form» не содержит определения для «SetMenuView» и нет метода расширения «SetMenuView», принимающего первый аргумент типа «System.Windows». .Forms.Form' может быть найден (вам не хватает директивы using или ссылки на сборку?) - person Ben; 06.12.2013
comment
На самом деле у меня возникла мысль. Могу ли я поместить вызов SetMenuView в другой метод, содержащий ссылку на главное меню, и таким образом получить к нему доступ? Или ссылка на Menu_View все еще будет мешать? - person Ben; 07.12.2013
comment
Основная проблема заключается в том, как вы сохраняете переменную для будущего использования. Когда вы создаете переменную, вы устанавливаете тип, который вы ожидаете хранить в ней. Например, MdiParent определяется как тип Form. Вы можете сохранить объект в этой переменной, если он определяет эту подпись где-то в своем дереве наследования. Когда вы извлекаете его, тип, под которым он был сохранен, указывает, что напрямую доступно для этого объекта. Вам нужно будет привести объект для доступа к свойствам или методам дальше по цепочке. Или вы можете создать свойство для хранения объекта как типа Main_Menu. - person Claies; 08.12.2013
comment
Мое понимание аксессоров все еще очень базовое, но я слежу за тем, как и почему это работает :) - person Ben; 09.12.2013