C # Winforms: Как получить ссылку на время разработки Form1 - PullRequest
0 голосов
/ 03 декабря 2008

У меня есть форма, которая имеет публичную собственность

public bool cancelSearch = false;

У меня также есть класс, который находится в моем bll (уровень бизнес-логики), в этом классе у меня есть метод, и в этом методе у меня есть цикл. Я хотел бы знать, как я могу получить метод для распознавания формы (этот пользовательский класс и form1 находятся в одном пространстве имен).

Я пробовал только Form1. но intellisense не распознает собственность. Также я попытался создать экземпляр формы с помощью Form f1 = winSearch.Form1.ActiveForm; но это тоже не помогло

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 03 декабря 2008

Когда вы вызываете бизнес-логику, которая должна знать информацию, передайте ссылку формы на метод.

Нечто подобное.

public class MyBLClass
{
    public void DoSomething(Form1 theForm)
    {
        //You can use theForm.cancelSearch to get the value
    }
}

затем при вызове из экземпляра Form1

MyBlClass myClassInstance = new MyBlClass;
myClassInstance.DoSomething(this);

ОДНАКО

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

1 голос
/ 03 декабря 2008

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

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

Application.Run(new Form1());

так что у вас есть пара опций, вы можете создать глобальную переменную (yuck) и отредактировать файл program.cs, чтобы использовать его.

Form1 myForm =  new Form1();
Application.Run(myForm);

Передайте ссылку на бизнес-объект из вашей рабочей формы, как предлагали некоторые другие

myBusinessObj.DoThisThing (это);

или найдите свою форму в коллекции Application.OpenForms и используйте ее.

1 голос
/ 03 декабря 2008

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

У меня сильное чувство, что у вас есть обработчик событий Button.Click, который запускает вашу бизнес-логику, и другой Button.Click, который устанавливает переменную cancelSearch. Это не сработает. Поток GUI, который запускает вашу бизнес-логику, не увидит нажатие другой кнопки. Если я прав, вы должны использовать рабочий поток.

1 голос
/ 03 декабря 2008

Ваш вопрос действительно неясен. Вы можете отредактировать его.

Рекомендации

Форма не должна переходить на уровень вашей бизнес-логики ...

Решения вашей проблемы

НО, если вы действительно хотите (НО это действительно не то, что нужно делать), вам нужно передать ссылку. Вы можете сделать это, передав ссылку в конструкторе вашего класса или свойством.

Метод с помощью конструктора

public class YourClass
{
    private Form1 youFormRef;

    public YourClass(Form1 youFormRef)
    {
        this.youFormRef = youFormRef;
    }
    public void ExecuteWithCancel()
    {
        //You while loop here
            //this.youFormRef.cancelSearch...
    }
}

Метод со свойством

public class YourClass
{
    private Form1 youFormRef;

    public int FormRef
    {
        set
        {
            this.youFormRef = value;
        }

        get
        {
            return this.youFormRef;
        }
    }

    public void ExecuteWithCancel()
    {
        //You while loop here
            //this.youFormRef.cancelSearch
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...