【问题标题】:C# Form is displaying an extra objectC# Form 正在显示一个额外的对象
【发布时间】:2020-10-28 19:32:05
【问题描述】:

所以我有一个名为 SalesRep 的父类和一个名为 SeniorSalesRep 的子类。我得到了它,所以它将两个类多态地显示到一个列表框。我遇到的问题是我有一个组合框,让用户可以选择显示 SalesRep 类中对象的报告,该类还应该显示 SeniorSalesRep 对象,如果只选择 SeniorSalesRep 它只显示 SeniorSales Rep 对象。但是,当我实现它时,它会创建一个名为 object 的额外对象,该对象仅显示 SalesRepObjects 而不是 SeniorSalesRep 对象。如何摆脱组合框中的多余对象?

 public void LoadTypeComboBox()
    {
        List<string> salesRepTypes = new List<string>();
        

        foreach (SalesRep thisSalesRep in allSalesReps)
        {
            string s = thisSalesRep.GetType().Name;
            string baseType = thisSalesRep.GetType().BaseType.Name;

            if (!salesRepTypes.Contains(s))
            {
                salesRepTypes.Add(s);
            }

            if (!salesRepTypes.Contains(baseType))
            {
                salesRepTypes.Add(baseType);
            }
        }

        cboObjectType.DataSource = salesRepTypes;
    }

    private void cboObjectType_SelectedIndexChanged(object sender, EventArgs e)
    {
    
        lstSalesReps.DataSource = null;
        lstSalesReps.Items.Clear();

      
        foreach (var i in allSalesReps)
        {
          
            if (i.GetType().Name == cboObjectType.SelectedItem.ToString())
            {
                lstSalesReps.Items.Add(i);
            }
            else if (i.GetType().BaseType.Name == cboObjectType.SelectedItem.ToString())
            {
                lstSalesReps.Items.Add(i);
            }
        }
    }

Form Output

【问题讨论】:

    标签: c# forms oop combobox polymorphism


    【解决方案1】:

    在组合框中显示object 的代码是这样的:

    string baseType = thisSalesRep.GetType().BaseType.Name;
    

    SalesRep 的基本类型是object。您应该从您的收藏中删除 object,或者一开始就不要添加。

    GetType 为您提供对象的运行时类型。所以我认为你不需要.BaseType。试试这个:

     public void LoadTypeComboBox()
        {
            List<string> salesRepTypes = new List<string>();
            
            foreach (SalesRep thisSalesRep in allSalesReps)
            {
                string type = thisSalesRep.GetType().Name;
    
                if (!salesRepTypes.Contains(s))
                {
                    salesRepTypes.Add(s);
                }
            }
    
            cboObjectType.DataSource = salesRepTypes;
        }
    

    使用 Linq 甚至更好:

    cboObjectType.DataSource = allSalesReps
                        .Select(r => r.GetType().Name)
                        .Distinct()
                        .ToList();
    

    【讨论】:

    • @ToriPerkins 如果对您的问题有帮助,您可以将其标记为已接受的答案 :)
    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多