Правильное использование свойств для поддержания HUD во вложенной форме? - PullRequest
0 голосов
/ 19 июня 2009

Редактировать 1

Возможно ли это сделать с помощью get / set? Что-то вроде ниже? Это работает для меня, но я волнуюсь, я что-то упускаю, не говоря уже о статичности .

///<summary>
/// Class to track and maintain Heads Up Display information
///</summary>
public static class HUD
{
    ///<summary>
    ///Declare variables to store HUD values
    ///</summary>
    private static string _lastName;
    private static string _firstName;
    private static string _middleName;
    private static string _suffix;
    private static string _sSN;
    private static string _personID;
    private static string _masterID;
    private static string _enrollmentID;
    private static string _planID;

    // Store a reference to THE form that holds the HUD and is visible
    private static FrmModuleHost _frmHUDHost;

    public static string PersonId
    {
        get { return _personID; }
        set
        {
            FrmHudHost.tbxHUD_PersonID.Text = value;
            _personID = value;
        }
    }

    public static string SSn
    {
        get { return _sSN; }
        set
        {
            FrmHudHost.tbxHUD_SSN.Text = value;
            _sSN = value;
        }
    }

    public static string MiddleName
    {
        get { return _middleName; }
        set
        {
            FrmHudHost.tbxHUD_MiddleName.Text = value;
            _middleName = value;
        }
    }

    public static string FirstName
    {
        get { return _firstName; }
        set
        {
            FrmHudHost.tbxHUD_FirstName.Text = value;
            _firstName = value;
        }
    }

    public static string LastName
    {
        get { return _lastName; }
        set
        {
            FrmHudHost.tbxHUD_LastName.Text = value;
            _lastName = value;
        }
    }

    public static string Suffix
    {
        get { return _suffix; }
        set
        {
            FrmHudHost.tbxHUD_SuffixName.Text = value;
            _suffix = value;
        }
    }

    public static string MasterID
    {
        get { return _masterID; }
        set
        {
            FrmHudHost.tbxHUD_MasterID.Text = value;
            _masterID = value;
        }
    }

    public static string EnrollmentID
    {
        get { return _enrollmentID; }
        set
        {
            FrmHudHost.tbxHUD_EnrollmontPeriod.Text = value;
            _enrollmentID = value;
        }
    }

    public static string PlanID
    {
        get { return _planID; }
        set
        {
            FrmHudHost.tbxHUD_PlanID.Text = value;
            _planID = value;
        }
    }

    public static FrmModuleHost FrmHudHost
    {
        get { return _frmHUDHost; }
        set { _frmHUDHost = value; }
    }
}

Оригинальный пост

У меня есть класс, который отвечает за обновление Heads Up Display информации о текущем выбранном члене. Мой класс выглядит так ->

public static class HUD
{
    ///<summary>
    ///Declare variables to store HUD values
    ///</summary>
    public static string _lastName;
    public static string _firstName;
    public static string _middleName;
    public static string _suffix;
    public static string _sSN;
    public static string _personID;
    public static string _masterID;
    public static string _enrollmentPeriod;
    public static string _planID;

    ///<summary>
    /// Method to update the display with current information
    ///</summary>
    public static void UpdateHUD (FrmModuleHost frm, params String[] args)
    {
        frm.tbxHUD_LastName.Text = args[0];
        _lastName = args[0];

        frm.tbxHUD_FirstName.Text = args[1];
        _firstName = args[1];

        frm.tbxHUD_MiddleName.Text = args[2];
        _middleName = args[2];

        frm.tbxHUD_SSN.Text = args[3];
        _sSN = args[3];

        frm.tbxHUD_PersonID.Text = args[4];
        _personID = args[4];

    }
}

Я пытаюсь понять, как я могу определить, какие аргументы передаются. Ниже вы видите то, что вызывается со страницы поиска, поскольку это все, что доступно на данный момент. Другие 4 значения будут загружены по одному на разных страницах. У человека есть регистрация, у которой есть план, если это поможет.

        private void GetResults()
    {
        var lName = getCurrentRowVal("Last Name");
        var fName = getCurrentRowVal("First Name");
        var pID = getCurrentRowVal("Person ID");
        var sSN = getCurrentRowVal("SSN");
        var mName = getCurrentRowVal("Middle Name");

        HUD.UpdateHUD(FrmWwcModuleHost, lName, fName, mName, sSN, pID);
    }

Теперь, когда я вызову это со страницы регистрации, я хочу, чтобы все осталось, и добавил EnrollmentID.

        private void GetResults()
    {
        var enrollmentID = getCurrentRowVal("EnrollmentID");

        HUD.UpdateHUD(FrmWwcModuleHost, enrollmentID);
    }

У меня вопрос: как мне это сделать и узнать, какой индекс arg [] вызывать, а не перезаписывать существующие значения?

Это так же просто, как всегда предоставлять ВСЕ параметры, как они установлены? Поэтому мой звонок со страницы регистрации будет выглядеть следующим образом ->

        private void GetResults()
    {
        var enrollmentID = getCurrentRowVal("EnrollmentID");

        HUD.UpdateHUD(FrmWwcModuleHost, HUD._lastName, HUD._firstName, HUD._middleName, HUD._sSN, HUD._personID, enrollmentID);
    }

Спасибо за любые идеи!

Ответы [ 9 ]

7 голосов
/ 19 июня 2009

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

2 голосов
/ 19 июня 2009

Я не увидел ссылку на конкретную версию .net, которую вы используете. Вот как я справляюсь с этим в .net 3.5.

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

 public class UpdateData {
    public string LastName { get; set;};
    public string FirstName  { get; set;};
    public string MiddleName  { get; set;};
 ...
 }

Теперь ваша подпись метода выглядит следующим образом:

public static void UpdateHUD (FrmModuleHost frm, UpdateData  data)
{
    if (!string.IsNullOrEmpty(data.FirstName) {
    frm.tbxHUD_LastName.Text = data.FirstName;
    _lastName = data.FirstName;
    }

    if (!string.IsNullOrEmpty(data.LastName) {
    frm.tbxHUD_FirstName.Text = data.LastName;
    _firstName = data.FirstName;
    }
    if (!string.IsNullOrEmpty(data.MiddleName) {
    frm.tbxHUD_MiddleName.Text = data.MiddleName;
    _middleName = data.FirstName;
    }

Далее следует установка UpdateData и вызов метода:

UpdateHUD(FrmWwcModuleHost, new UpateData{ FirstName = "test1", LastName = "test2", ...});

Последнее замечание: здесь вы используете много статики. Вы могли бы рассмотреть возможность изменения большинства из них. Переместите статические переменные в реальный класс со свойствами (но без статики) и создайте ссылку на класс в своем коде.

2 голосов
/ 19 июня 2009

Вы также можете создать отдельный класс для передачи в массив params. Что-то вроде:

public class HUDParam {
   public HUDParam(paramName, paramValue) { /*[init code here...]*/ }
   public string Name { get; set; }
   public string Value { get; set; }
}

Тогда:

HUD.UpdateHUD(frm, new HUDParam("FirstName", "Tom"), 
    new HUDParam("LastName", "Thompson");

В вашем методе обновления вы можете просто проверить имя и установить соответствующее значение в вашем HUD.

2 голосов
/ 19 июня 2009

Возможно вместо

params String[] args

вы должны сделать

params KeyValuePair<String,String>[] args

где свойствам любого данного параметра будет присвоено что-то вроде этого:

Key = "Last Name"
Value = "Hare"

Затем в вашем методе UpdateHUD вы можете проверить, что было Key параметра, чтобы вы знали, какое значение передается.

1 голос
/ 19 июня 2009

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

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

1 голос
/ 19 июня 2009

Если вы можете использовать Framework 4.0, вы можете использовать необязательные и именованные параметры . До этого времени вам нужно будет передать все аргументы.

Но я думаю, что по вашему вопросу вы можете неправильно понять, что происходит. Аргументы, которые вы отправляете в параметрах, входят в метод в качестве аргумента. Поэтому их область действия - сам метод, поэтому вы ничего не «перезаписываете». Массив, который вы использовали для первого вызова, исчез (из области видимости), и массив, который вы используете для второго вызова, будет иметь то, что вы вставили в него. Лучший способ сделать необязательные параметры до 4.0 - это использовать перегрузки нескольких методов.

1 голос
/ 19 июня 2009

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

Самой чистой версией было бы создание метода для каждой переменной. например

void UpdateLastName(string name)
{
   frm.tbxHUD_LastName.Text = _lastName = name;
}
1 голос
/ 19 июня 2009

C # 4.0 имеет необязательные параметры, которые сильно отличаются от ключевого слова params. Ключевое слово Params буквально не отличается во время выполнения, если бы у вас не было ключевого слова params вообще. Другими словами, вы просто получаете массив значений без возможности узнать, какие есть какие. Ключевое слово Params - это просто удобство C # во время компиляции.

Хотя я еще не использовал необязательные параметры C # 4.0, я думаю, что они ведут себя так же, как необязательные параметры VB.NET, в которых вы можете указать значение по умолчанию для функции, и это значение будет использоваться, если вызывающий не не указывайте это. Но вызывающая сторона все равно должна указать (либо с отсутствующими значениями, либо с синтаксисом paramName: =), какой параметр они указывают.

В вашем случае, я думаю, вам лучше использовать либо обычные именованные параметры и передавать значение NULL, когда они вам не нужны, либо вместо этого передавать словарь / хеш-таблицу.

0 голосов
/ 19 июня 2009

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

Новое определение функции:

public static void UpdateHUD (FrmModuleHost frm, object args);

И код клиента:

UpdateHUD(frm, new {
    MiddleName = "Jed",
    SSN = "..." });

Используя код Блог Роя Ошерова , это можно превратить в словарь. Новая реализация будет похожа на:

var dictionary = MakeDictionary(args);
if ( dictionary.ContainsKey("SSN") ) { _sSN = dictionary["SSN"]; }

Конечно, все это будет неактуально, когда выйдет C # 4.0.

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