Frage

Ich habe eine Erweiterungsmethode aus der Datagridview genannt HideColumns geschrieben.

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

}

Ich gebe mein Gitter in ein IronRuby Skript als eine Variable namens main_grid

Wenn mein Skript Anrufe     main_grid.HideColumns ( "Vorname", "Name") das Skript bläst mit Fehler in Script up nicht definierte Methode 'HideColumns' für System.Windows.Forms.DataGridView: System :: Windows :: Forms :: Datagridview

Die Erweiterungsmethoden scheinen in Ordnung von C # zu arbeiten. Was soll das?

War es hilfreich?

Lösung

FWIW, IronRuby 1.1 (benötigt .net 4) liefert die using_clr_extensions Verfahren - wie bereits in der Release Notes diese alle Erweiterungsmethoden auf Klassen in einem bestimmten Namensraum definiert definiert aktiviert, unabhängig von der Montage sie in definiert sind; Baugruppen in Zukunft geladen, die Erweiterungsmethoden im aktivierten Namensraum definieren wird auf den richtigen Typen automatisch angezeigt, wie folgt aus:

load_assembly "System.Core"
using_clr_extensions System::Linq

# ...

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

Die Release Notes weisen auch auf eine ganze Reihe von Beispielen unter http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb

Andere Tipps

Die Erweiterung Methode ist nur syntaktischer Zucker, müssen Sie es nennen wie:

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

alternativ eine neue Klasse in C # erstellen, die von Datagridview leitet und fügen Sie die Methode:

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

und diese Klasse verwenden, anstatt die System.Windows.Forms Klasse auf dem Formular.

Da Sie es in den Kommentaren zu JDunkeryly Antwort erwähnt, ist hier, wie Sie das Gitter aus der rubin Seite erstrecken würde. Öffnen Sie einfach die Klasse und eine Methode (nur von der rubin Seite funktioniert).

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

Was der Vorschlag direkt die Erweiterungsmethode zu verwenden, das Schlüsselwort params zu IronRuby schmerzhaft ist. Sie benötigen einen typisierten Array mit Argumenten zu bauen und es passiert. Sie können nicht nur wickeln Sie Ihren Rubin Strings in einem Rubin-Array. Ich habe dies aus dem heutigen Tag ziehe in einem Blog Post . Aber wenn Sie einen glatten Weg haben, damit umzugehen, lassen Sie es mich wissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top