【问题标题】:How do I write a method that can take either a DataGridView or a ListView as input?如何编写可以将 DataGridView 或 ListView 作为输入的方法?
【发布时间】:2013-02-10 02:07:09
【问题描述】:

我正在使用以下两种方法来保存有关 DataGridView 和 ListView 的列信息。

我注意到这些方法非常相似,实际上我使用相同的数据结构来存储列设置。我为每一列存储的属性是诸如可见、宽度、显示索引之类的东西

我怎样才能重写它,以便我有一个可以处理 DataGridView 或 ListView 的函数?

我曾考虑调查 DataGridView 和 ListView 是否都继承自一个公共类或实现一个公共接口 - 但我不知道如何找出答案。

我也考虑过扩展每个类来实现一个通用接口......但我不知道如何进行。

 public void SaveDataGridView ( DataGridView view)
 {
      foreach (DataGridViewColumn col in view.Columns)
      {
           // save properties     
      }
 }

 public void SaveDataListView(ListView view)
 {
      foreach (ColumnHeader col in view.Columns)
      {
           // save properties   
      }
 }

【问题讨论】:

  • 我会说你运气不好。我查看了类继承树,你没有希望。如果您在循环中以通用类型保存列状态,那就很好了。我会收工并找到应用程序的其他部分来“改进”。 :)
  • // save properties 里面是什么?
  • 你为什么要循环列集合?为什么没有相应的RowsItems?他们都只实现了ILIst
  • 设置了关于我要保存的列的信息。如列宽和位置

标签: c# .net winforms listview datagridview


【解决方案1】:

没有办法,除非使用dynamic关键字不会提高性能。

DataGridView.ColumnsListView.Columns 没有共同的基本类型(IList 除外,尝试但我怀疑运气)。 ColumnHeaderDataGridViewColumn 都没有。

【讨论】:

    【解决方案2】:

    它们都继承自Control class。所以你可以写一个这样的函数:

    public void SaveView(Control view)
    {
        if(view is DataGridView)
        {
            //stuff
        }
        if(view is ListView)
        {
            //stuff
        }
    }
    

    控件非常通用,所以这个函数没有多大意义,因为有大量的有效参数。不幸的是,Grid 和 List 没有从更具体的父类继承。

    【讨论】:

    • 和OP的代码差不多。他可以同样命名这两种方法,使它们成为单个方法的重载,这样您的代码将完全相等。
    【解决方案3】:

    我最终做了以下事情

    interface IView
    {
       void SaveView(Control control );
    }
    
    public class GridViewHelper : IView
    {
        public void SaveView(Control control)
        {
            var view = (DataGridView)control;
            foreach (DataGridViewColumn col in view.Columns)
            {
                // save properties
            }
        }
    }
    
    public class ListViewHelper : IView
    {
    
        public void SaveView(Control control)
        {
            var view = (ListView)control;
            foreach (ColumnHeader  col in view.Columns)
            {
                // save properties
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      相关资源
      最近更新 更多