【问题标题】:Correct use of Properties to maintain a HUD in a nested Form?正确使用属性来维护嵌套表单中的 HUD?
【发布时间】:2010-11-04 03:46:17
【问题描述】:

编辑 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; }
    }
}

原帖

我有一个类负责更新当前选定成员信息的平视显示。我的课是这样的 -->

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 个值将在不同页面上一次加载 1 个。一个人有一个注册,如果有帮助,就有一个计划。

        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);
    }

感谢您的任何见解!

【问题讨论】:

  • 您的代码要求在 params 部分中传递恰好四个参数。如果您要求它始终为四个,为什么要首先使用参数数组?参数数组的目的是可以传递任意数量的参数,例如,名称列表。为什么不简单地说 public static void UpdateHUD (FrmModuleHost frm, string last, string first, string middle, string id)?
  • 因为可能不知道中间名。并非所有类型的会员都需要 SSN。与注册和计划 ID 相同。唯一可以硬编码的字段是名字和姓氏。
  • 然后为每个支持的组合做不同的重载。
  • 我希望这是一个单用户、单线程的应用程序。没有任何锁定的静态变量的所有修改都给了我勇气。
  • 是的,虽然我想弄清楚如何在这里使用 OOP。似乎我需要将我的对象传递给每个表单。

标签: c# winforms oop properties


【解决方案1】:

我要做的是使用匿名类型(可以在运行时将其转换为字典),然后更改存在的值。

新函数定义:

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

和客户端代码:

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

使用Roy Osherove's Blog 中的代码,可以将其转换为字典。新的实现类似于:

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

当然,当 C# 4.0 出来时,这一切都无关紧要了。

【讨论】:

  • -1 这需要反射来遍历类型,然后需要更多管道来访问每个成员。
【解决方案2】:

您确实需要放弃 params 样式调用并为您的方法建立真正的参数。只需为您最常见的调用签名创建多个重载。

【讨论】:

    【解决方案3】:

    C# 4.0 具有与 params 关键字大不相同的可选参数。 Params 关键字在运行时与根本没有 params 关键字的情况没有什么不同。换句话说,你只是得到一个值数组,无法知道哪个是哪个。 Params 关键字只是 C# 在编译时的便利。

    虽然我还没有使用 C# 4.0 可选参数,但我想它们的行为类似于 VB.NET 可选参数的行为方式,您可以在函数中指定默认值,如果调用者不使用该默认值,则将使用该默认值不要指定它。但是调用者仍然必须指出(使用缺失值或 paramName:= 语法)他们正在指定哪个参数。

    在您的情况下,我认为您最好使用普通的命名参数并在不需要它们时传递 null,或者改为传递字典/哈希表。

    【讨论】:

      【解决方案4】:

      也许不是

      params String[] args
      

      你应该这样做

      params KeyValuePair<String,String>[] args
      

      任何给定参数的属性将被分配如下:

      Key = "Last Name"
      Value = "Hare"
      

      然后在您的UpdateHUD 方法中,您可以检查参数的Key 是什么,这样您就可以知道传递的是哪个值。

      【讨论】:

        【解决方案5】:

        您可以使用字典传递参数,您可以在其中将值分配给某个名称。

        最简洁的版本是为每个变量创建一个方法。 例如

        void UpdateLastName(string name)
        {
           frm.tbxHUD_LastName.Text = _lastName = name;
        }
        

        【讨论】:

        • 那么我的HUD中的每个字段都有一个方法吗?这可能是可行的,因为它们只有 9 个。
        【解决方案6】:

        如果你可以使用 Framework 4.0,你可以使用optional and named parameters。在此之前,您需要传递所有参数。

        但是,我认为通过您的问题,您可能会稍微误解正在发生的事情。您在 params 中发送的参数将作为参数进入方法。因此,它们的范围是方法本身,因此您不会“覆盖”任何东西。您用于第一次调用的数组已消失(超出范围),您用于第二次调用的数组将包含您放入的任何内容。在 4.0 之前执行可选参数的最佳方法是使用多个方法重载。

        【讨论】:

        • 4 目前不是一个选项。至于你的第二点;如果我传入 Null,我不会丢失现有信息吗? IE。我传入 EnrollmentID 时的名字?
        【解决方案7】:

        您还可以创建一个单独的类来传递 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 中设置适当的值。

        【讨论】:

          【解决方案8】:

          如果您与某个值有名称关联,但可能是未知的名称值,则这是字典的候选对象。

          可选参数涉及的检查不亚于检查字典是否存在键或类的成员是否为空。由于已经存在一个原语,而且它更灵活,我认为没有理由使用可变参数或可选参数。

          【讨论】:

            【解决方案9】:

            我没有看到对您正在使用的特定版本的 .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", ...});
            

            最后说明:您在这里使用了很多静态参数。您可能会考虑更改其中的大多数。将静态变量移动到具有属性(但没有静态)的实际类中,并在代码中引用该类。

            【讨论】:

              猜你喜欢
              • 2013-06-05
              • 2017-10-11
              • 2016-10-16
              • 1970-01-01
              • 2012-07-04
              • 1970-01-01
              • 2019-04-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多