WinForms и дочерние формы - Как консолидировать избыточный «служебный» код? - PullRequest
1 голос
/ 08 мая 2011

Сначала я искал и гуглил, думая, что наверняка кто-то уже спрашивал об этом раньше, но я точно не могу найти хорошее описание этой проблемы.

У меня есть шесть или восемь аналогичных приложений WinForms на C # .NET 2.0, построенных с довольно распространенной моделью главного окна приложения с несколькими полями данных графического интерфейса пользователя и несколькими модальными диалоговыми окнами для дальнейшего сбора данных. Многие из полей данных (особенно TextBoxes) имеют идентичные процедуры проверки данных. Я пишу одни и те же подпрограммы xxx_Validating () снова и снова, которые в простейшем случае используют только заглавные буквы первого символа введенного текста (если есть) и переотображают результат. У меня есть еще один для полей почтового индекса, который берет первые 3 цифры 5-значного почтового почтового индекса США и возвращает соответствующее состояние, используя массив строк из 1000 членов. Простые вещи Есть несколько других; Вот пример:

public void CapFirstCharTextBox_Validating(object sender, CancelEventArgs e)
{
    string strValue = ((TextBox)sender).Text.Trim();
    if (strValue.Length >= 1) {
        if (char.IsLower(strValue[0])) {
            strValue = strValue.Substring(0, 1).ToUpper() + strValue.Substring(1);
            ((TextBox)sender).Text = strValue;     // fires (whatever sender)_TextChanged()
        }
    }
}

Опять же, это часть полдюжины таких "полезных" процедур. У меня есть только один набор из них для каждого класса диалогового окна, и все различные TextBox в этом диалоговом окне, которые нуждаются в этом, имеют свое событие Validating, указывающее на один и тот же метод. Так что не похоже, что у меня есть 20 из них в данном исходном файле (по одному для каждого TextBox) или что-то еще; есть только один для всего класса диалога.

Проблема в том, что все они существуют в каждом исходном файле, где они мне нужны. Это один набор для главного окна и больше для каждого всплывающего диалогового окна - и это слишком много. Я понимаю, что классы модальных диалоговых окон не могут общаться друг с другом, и сделать все эти вещи глобальными в лучшем случае неуловимо, а в худшем - большим «нет-нет».

Я успешно попытался передать ссылку на «FormMain» (где существует одна копия этих подпрограмм) различным конструкторам диалогов, а затем вызвал эти подпрограммы проверки вместе с их собственными обработчиками проверки. Это работает, но кажется ужасно неуклюжим и, конечно, не лучшим подходом.

Итак, как бы я (или я бы хотел) перестроить проект и организовать код лучше, чтобы иметь только один экземпляр подобных вещей? Как бы я подключил глобальный «служебный» класс таких методов, чтобы я мог получить к нему из кода основной формы, а также из набора всплывающих модальных диалоговых окон?

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

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

Возможно ли это?

1 Ответ

1 голос
/ 08 мая 2011

Вы можете обмениваться кодом между решениями, храня код в одном месте и добавляя ссылку на файл в каждом решении.

Чтобы добавить ссылку: щелкните правой кнопкой мыши проект (или папку), которую вы хотите добавитькод, затем выберите «Добавить существующий элемент», найдите файл, при обнаружении нажмите стрелку вниз на кнопке и выберите «Ссылка на».

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

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

...