【问题标题】:Hide certain properties of a class in DataGridView在 DataGridView 中隐藏类的某些属性
【发布时间】:2016-04-11 12:44:21
【问题描述】:

我知道之前有人问过类似的问题,但我的问题有点不同。我尝试了大多数以前建议的解决方案,但都没有奏效。

所以问题是我有两个类,如图所示:

public class Dog
{
    public String Name { get; set; }
    public int Age{ get; set; }
}
public class Person
{
    public String First_Name { get; set; }
    public String Last_Name { get; set; }
    public Dog dog { get;set;}
}

另外,我有一个人员列表 List 我在 datagridview 中显示。 问题是当我显示它们时,我会得到类似的东西

但我需要的是:

我设法修复它的唯一方法是在 To_String 方法中只返回狗的名字,但这对我不起作用,因为我需要返回名字和狗的年龄。

我希望你能理解我并能帮助我。

【问题讨论】:

  • 为什么不创建一个像 ToStringBoth() 这样的新函数,它同时返回两者,而 toString 只返回名称?

标签: c# winforms class oop datagridview


【解决方案1】:

我对当前建议(甚至赞成)的答案感到惊讶,该答案建议创建另一个列表只是为了更改值的显示表示。

您要问的是格式化,每个 UI 框架/组件都支持。有关详细信息,请参阅我对 changing the value of a cell in gridview at runtime 的回答。

您只需要处理CellFormatting 事件并在处理程序中放入如下内容:

var dog = e.Value as Dog;
if (dog != null)
{
    // Display whatever you like
    e.Value = dog.Name;
    e.FormattingApplied = true;
}

完整样本:

using System;
using System.Windows.Forms;

namespace Samples
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form();
            var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form };
            dg.CellFormatting += (sender, e) =>
            {
                var dog = e.Value as Dog;
                if (dog != null) { e.Value = dog.Name; e.FormattingApplied = true; }
            };
            dg.DataSource = new[]
            {
                new Person { First_Name = "Ben", Last_Name = "Harison", dog = new Dog { Name = "Billy", Age = 50} },
                new Person { First_Name = "Rob", Last_Name = "Jonson", dog = new Dog { Name = "Puppy", Age = 25} },
            };
            Application.Run(form);
        }
    }

    public class Dog
    {
        public String Name { get; set; }
        public int Age { get; set; }
    }
    public class Person
    {
        public String First_Name { get; set; }
        public String Last_Name { get; set; }
        public Dog dog { get; set; }
    }
}

结果:

【讨论】:

  • 非常感谢您的帮助。我看到了两个答案,老实说,由于赞成票,我首先要尝试另一个答案,但是当我看到您建议的方式时,我意识到另一个答案有多么错误。再次感谢您,或者最好说 Благодаря ти !
【解决方案2】:

您可以使用 LINQ 中的 Select 函数:

this.datagridview.DataSource=youList.Select(x=>new {x.First_Name,x.Last_Name,Dog=x.Dog.Name}).ToList();

【讨论】:

    猜你喜欢
    • 2014-07-04
    • 2015-11-14
    • 1970-01-01
    • 2012-09-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多