0

我已经编写了一个名为 HideColumns 的 DataGridView 扩展方法。

public static class Extensions
{
    public static void HideColumns(this DataGridView dataGridView, params string[] columnNames)
    {
        foreach (string str in columnNames)
        {
            if (dataGridView.Columns[str] != null)
            {
                dataGridView.Columns[str].Visible = false;
            }
        }
    }

}

我将网格作为名为 main_grid 的变量传递给 IronRuby 脚本

当我的脚本调用 main_grid.HideColumns("FirstName","LastName") 时,脚本因 System.Windows.Forms.DataGridView:System::Windows::Forms::DataGridView 的脚本未定义方法 'HideColumns' 中的错误而爆炸

扩展方法似乎在 C# 中可以正常工作。是什么赋予了?

4

3 回答 3

2

FWIW,IronRuby 1.1(需要 .net 4)提供了该using_clr_extensions方法——如发行说明中所述,这将激活在给定命名空间中定义的类上定义的所有扩展方法,无论它们定义在哪个程序集中;将来加载的在激活的命名空间中定义扩展方法的程序集将自动出现在正确的类型上,如下所示:

load_assembly "System.Core"
using_clr_extensions System::Linq

# ...

products.
  where(lambda { |p| p.units_in_stock == 0 }).
  each { |x| puts x.product_name }

发行说明还指出了http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb上的一整套示例

于 2011-04-06T20:53:38.663 回答
1

扩展方法只是语法糖,您需要将其称为:

Extensions.HideColumns(main_grid, "FirstName", "LastName")

或者在 C# 中创建一个派生自 DataGridView 的新类并添加方法:

public class DataGridViewExt : DataGridView  
{
    public void HideColumns(params string[] columnNames)
    {
        foreach (string str in columnNames)
        {
            if (this.Columns[str] != null)
            {
                this.Columns[str].Visible = false;
            }
        }
    }        
}

并在表单上使用此类而不是 System.Windows.Forms 类。

于 2009-09-23T14:07:51.803 回答
0

由于您在对 JDunkeryly 的回答的评论中提到了它,这就是您如何从 ruby​​ 方面扩展网格的方法。只需打开类并添加一个方法(仅适用于 ruby​​ 方面)。

class System::Windows::Forms::DataGridView
  def hide_columns(*columnNames)
    column_names.each do |cn|
      self.columns[cn].visible = false
    end
  end
end

至于直接使用扩展方法的建议,params 关键字对 IronRuby 来说是痛苦的。您需要使用您的参数构建一个类型化数组并传递它。您不能只将 ruby​​ 字符串包装在 ruby​​ 数组中。我今天早些时候在一篇博文中提到了这一点。但是,如果您有更流畅的处理方式,请告诉我。

于 2009-09-23T15:16:35.703 回答