Question

J'ai écrit une méthode d'extension hors de HideColumns appelé 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;
            }
        }
    }

}

Je passe ma grille dans un script IronRuby comme une variable appelée main_grid

Quand mes appels de script     main_grid.HideColumns ( "FirstName", "LastName") le script explose avec erreur dans Script méthode non définie '' pour des HideColumns System.Windows.Forms.DataGridView: System :: :: de Windows Forms :: DataGridView

Les méthodes d'extension semblent fonctionner bien de C #. Ce qui donne?

Était-ce utile?

La solution

FWIW, IronRuby 1.1 (a besoin .net 4) fournit la méthode using_clr_extensions - comme indiqué dans les notes de ce qui active toutes les méthodes d'extension définies sur les classes définies dans un espace de noms donné, quel que soit l'assemblage qu'ils sont définis dans; assemblées chargées dans l'avenir qui définissent les méthodes d'extension dans l'espace de noms activé apparaîtront automatiquement sur les types corrects, comme ceci:

load_assembly "System.Core"
using_clr_extensions System::Linq

# ...

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

Les notes de version indiquent également un ensemble d'exemples à http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb

Autres conseils

La méthode d'extension est juste le sucre syntactique, vous devez l'appeler comme:

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

alternativement créer une nouvelle classe en C # qui dérive de DataGridView et ajouter la méthode:

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

et utiliser cette classe plutôt que la classe System.Windows.Forms sur votre formulaire.

Comme vous l'avez mentionné dans les commentaires à la réponse de JDunkeryly, voici comment vous prolongez la grille du côté rubis. Il suffit d'ouvrir la classe et ajouter une méthode (ne fonctionne que du côté rubis).

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

En ce qui concerne la suggestion d'utiliser la méthode d'extension directement, le mot-clé params est pénible à IronRuby. Vous devez construire un tableau typé avec vos arguments et de le transmettre. Vous ne pouvez pas simplement envelopper vos chaînes de rubis dans un tableau rubis. J'ai tiré cette large plus tôt aujourd'hui dans un Blog poster . Mais si vous avez une façon plus douce pour gérer cela, s'il vous plaît laissez-moi savoir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top