Как попросить пользователя для ввода (через форму) из другого класса во время цикла? - PullRequest
0 голосов
/ 15 февраля 2011

Как заполнить форму из метода в библиотеке классов?Таким образом, в приведенном ниже примере суть Method1 ().

Project "UI", Windows Forms Application
reference to MyLib
public class Form1 : Form
{
   ...
   call some methods from MyLib.MyClass
   ...
}

Project "MyLib", Class Library
public class MyClass
{
   ... 
   public void Method1()
       {
           loop through an array and ask user to validate some data on the form during each iteration
       }
}

ОБНОВЛЕНИЕ: Если быть более точным, библиотека MyLib содержит класс, который будет загружать файл .csv в массив (который для каждой строкибудет добавлен в List<string[]>), а затем перебирает List<string[]> в поисках «возможных» дубликатов.Всякий раз, когда кто-то обнаруживается, пользователь должен быть представлен (в форме) с обеими записями, чтобы в конечном итоге решить, являются ли они одинаковыми.

Ответы [ 4 ]

1 голос
/ 15 февраля 2011

Как заполнить форму из метода в библиотеке классов?

Реальный вопрос: зачем вам это нужно?Библиотека не должна нести ответственность за что-то подобное.Это логика, специфичная для вашего рабочего процесса и пользовательского интерфейса, а не то, для чего обычно используется библиотека.Библиотека должна предоставлять полезные структуры данных, но вещи, специфичные для вашего приложения (например, сбор ввода и решение, что с ним делать), должны обрабатываться вашим кодом.

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

дрожь

0 голосов
/ 15 февраля 2011

Это большой вопрос.

Самый простой способ - добавить ссылку на System.Windows.Forms в свой класс lib.Затем передайте окно в качестве аргумента вашему бизнес-классу.Но хотя это простое решение, оно не является чистым способом.В чистой многоуровневой архитектуре нельзя использовать объекты верхних уровней в нижних слоях.Это может быть как проблемой для компиляции, так и черной дырой обслуживания.Более того, модульное тестирование в таких случаях является сложным.

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

Основная идея состоит в том, чтобы создать в вашей библиотеке классов интерфейс, который определяет взаимодействие с пользователем, например, так:

public interface IInputValidator {
     bool IsValid(MyClass itemToValidate);
}

Затем в приложении Windows Form реализуйте этот интерфейс:

public class Form1 : Form, IInputValidator {

    public void CallBusinessClass() {
        var myObj = new BusinessClass(this); // the key of the concept is here
        myObj.Iterate();
    }
    public bool IsValid(MyClass itemToValidate) {
        return MessageBox.Show("Is valid ?", MessageBoxButtons.YesNo) == MessageBoxButtons.Yes);
    }
}    

Тогда в вашем бизнес-классе:

public class BusinessClass {
    private IInputValidator m_validator;
    public BusinessClass(IInputValidator validator) {
        this.m_validator = validator;
    }

    public void Iterate()
    {
        foreach(var item in ItemsToIterate)
        {
            var isValid = m_validator.IsValid(item); // call the upper layer from a lower layer
        }
    }
}

Надеюсь, что поможет

0 голосов
/ 15 февраля 2011

Несмотря на то, что Эд добавил последний комментарий, НЕ ДЕЛАЙТЕ ЭТОГО! Конечно, это возможно, но это не имеет смысла. Не поддавайся искушению!

Библиотека должна реализовывать некоторые общие функции, то есть предоставлять структуры данных, логические методы или, возможно, методы P / Invoke. Но в вашей форме класс - это то, куда логичен ваш пользовательский интерфейс. Просто создайте метод в Form1 для обработки проверки. Это было бы намного проще и понятнее.

0 голосов
/ 15 февраля 2011

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

Вы также можете объявить объект типа Form (лучше, если он статический) в библиотеке классов и передать эту форму в качестве ссылки, и вы можете вызывать дочерние элементы управления внутри этой ссылочной переменной через член "Controls", если я не ошибаюсь .

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