Domanda

Ho scritto un metodo di estensione al largo di DataGridView chiamato HideColumns.

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

}

Io passo la mia griglia in uno script IronRuby come chiamato main_grid variabile

Quando le mie chiamate di script     main_grid.HideColumns ( "FirstName", "Cognome") lo script esplode con l'errore nello script metodo non definito '' HideColumns per System.Windows.Forms.DataGridView: System :: :: di Windows Forms :: DataGridView

I metodi di estensione sembrano funzionare bene da C #. Ciò che dà?

È stato utile?

Soluzione

FWIW, IronRuby 1.1 (necessita NET 4) fornisce il metodo using_clr_extensions - come notato nella release note ciò attiva tutti i metodi di estensione definiti classi definite in un determinato spazio, indipendentemente dal montaggio sono definiti in; assembly caricati nel futuro che definiscono i metodi di estensione nello spazio dei nomi attivato appariranno automaticamente sui tipi corretti, in questo modo:

load_assembly "System.Core"
using_clr_extensions System::Linq

# ...

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

Le note di rilascio indicano anche tutta una serie di esempi a http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb

Altri suggerimenti

Il metodo di estensione è solo zucchero syntatic, sarà necessario chiamare come:

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

In alternativa creare una nuova classe in C # che deriva da DataGridView e aggiungere il metodo:

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

e utilizzare questa classe, piuttosto che la classe System.Windows.Forms sul modulo.

Dal momento che lei ha citato nei commenti alla risposta di JDunkeryly, ecco come si sarebbe estendere la griglia dal lato rubino. Basta aprire la classe e aggiungere un metodo (funziona solo dal lato rubino).

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

Per quanto riguarda il suggerimento di utilizzare il metodo di estensione direttamente, la parola chiave params è doloroso IronRuby. È necessario costruire una matrice tipizzato con i tuoi argomenti e passarlo. Non si può semplicemente avvolgere le corde rubino in un array di rubino. Ho tirato questo fuori prima di oggi in un blog postare . Ma se si dispone di un modo più agevole per gestire questo, per favore fatemelo sapere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top