Как исправить экземпляр при попытке получить доступ к кнопке другой winform? - PullRequest
0 голосов
/ 12 ноября 2018

привет, у меня есть этот код здесь (Owner as ReadBarCodeInMenu).btnContainerInquiry.Enabled = true; он заставляет меня выдавать экземпляр всякий раз, когда я пытаюсь получить доступ к кнопке другой страницы, он пробовал этот код в тестовых 2 формах, и он прекрасно работает, но когда я помещаю его в систему, я дал мне ошибку. Пожалуйста, помогите мне

редактирование:

Форма ReadBarCodeInMenu

private void btnContainerInquiry_Click(object sender, EventArgs e)
    {
        inquiry.Owner = this;
        btnContainerInquiry.Enabled = false;
    }

форма Контейнерный запрос

private void logoutBtn_Click(object sender, EventArgs e)
    {
      (Owner as ReadBarCodeInMenu).btnContainerInquiry.Enabled = true; 
      error// {"Object reference not set to an instance of an object."}
      close.      
    }

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

1 Ответ

0 голосов
/ 12 ноября 2018

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

private ReadBarCodeInMenu _readBarCodeInMenu;

public ContainerInquiry(ReadBarCodeInMenu readBarCodeInMenu)
{
    InitializeComponent();
    _readBarCodeInMenu = readBarCodeInMenu;
}

private void logoutBtn_Click(object sender, EventArgs e)
{
    _readBarCodeInMenu.btnContainerInquiry.Enabled = true; 
}

Также измените доступность btnContainerInquiry с private на internal (или public).


Тогда в форме ReadBarCodeInMenu

// Pass a reference of ReadBarCodeInMenu to ContainerInquiry.
var frm = new ContainerInquiry(this);
...

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

Операция с несколькими потоками недопустима: элемент управления 'btnContainerInquiry' доступен из потока, отличного от потока, в котором он был создан.

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

var btn = _readBarCodeInMenu.btnContainerInquiry;
if (btn.InvokeRequired) {
    btn.Invoke(new Action(() => btn.Enabled = true));
} else {
    btn.Enabled = true; 
}

Вы также можете создать метод расширения, который автоматизирует этот процесс, как показано здесь: https://stackoverflow.com/a/12179408/880990

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...