2009-07-24 22 views
7

Digamos que tengo un objeto comercial llamado Sample y tengo BindingList of Samples. Una muestra tiene 4 propiedades.Encuadernación a BindingList <T> - ¿elegir qué ligar?

¿Puedo seleccionar qué propiedades están vinculadas a DataGrid o no hay ninguna opción para personalizar tal cosa?

NOTA: Estoy utilizando Compact Framework, donde NO hay DataGridView, así como propiedad de autogeneración y propiedad DataMember.

Tenga esto en cuenta al responder.

Respuesta

0

Supongo que se refiere a DataGrid en WinForms, pero lo mismo se aplica a la mayoría de los controles enlazables.

Sí, puedes hacer esto. La forma de hacerlo es un proceso de 2 pasos

  • Establezca el miembro de DataSource para que sea la instancia del BindingList<T>.
  • Establezca la propiedad DataMember para que sea el nombre de la cadena de la propiedad que desea vincular.
+0

Gracias. La propiedad DataMember falta en la clase CompactGrid DataGrid. ¿Hay alguna manera de hacerlo en el nivel BindingList? Lo que estoy buscando es una forma de marcar una propiedad de muestra no enlazable ... – sarsnake

9
BindingList<Sample> samples = new BindingList<Sample>(); 
DataGridView dgv = new DataGridView(); 
dgv.DataSource = samples; 

Esto debería mostrar cada propiedad pública como una columna en DataGridView. Si desea cambiar las propiedades que se muestran, es necesario hacer lo siguiente, así:

dgv.AutoGenerateColumns = false; 

y entra en las propiedades del DataGridView, agrega las columnas manualmente y establecer el DataPropertyName al nombre de propiedad.

Si creó el datagridview en el código, lo siguiente creará y agregará una columna al dgv.

DataGridViewColumn dgvc = new DataGridViewColumn(); 
dgvc.Name = "PropertyA"; 
dgvc.HeaderText = "Property A"; 
dgvc.DataPropertyName = "PropertyA"; 
dgv.Columns.Add(dgvc); 


EDITAR

Esto debería darle algo más cercano a lo que estaba deseando. Sin embargo, debido a que usa una clase anónima, no puede usar BindingList (que yo sepa). Alternativamente, puede crear una clase SampleBinding que solo tenga las propiedades que desea mostrar y generarlas de la lista de muestras normales.

public class Sample 
{ 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    public double PropertyD {get;set;} 
} 

List<Sample> samples = new List<Samples>(GetSamples()); 
var sampleBinding = from sample in samples 
        select new 
        { 
         PropertyA = sample.PropertyA, 
         PropertyC = sample.PropertyC 
        }; 

BindingList bl = new BindingList(); 
bl.DataSource = sampleBinding; 
dgv.DataSource = bl; 


EDITAR 2

public class Sample 
{ 
    [Browsable(false)] 
    public int PropertyA {get;set;} 
    public bool PropertyB {get;set;} 
    public string PropertyC {get;set;} 
    [Browsable(false)] 
    public double PropertyD {get;set;} 
} 
+0

Gracias, estoy haciendo algo equivalente a esto en Compact Framework. Pero esto no es muy dinámico ya que aún necesito codificar la cadena "PropertyA" o cargarla en alguna constante. Me refiero más a quizás cada propiedad de Sample que tiene una propiedad Bindable que podría activarse o desactivarse. O, en otras palabras, vincular BindingList personalizado ... ¿Supongo que no es posible? Olvidémonos de las columnas de dataGrid por ahora (sé cómo hacerlo). ¿Hay alguna manera de hacerlo a través de BindingList? – sarsnake

+0

En cuanto a las propiedades/métodos para BindingList que no parece probable. Deme unos minutos para obtener más código para otra forma de probar esto. –

+0

algo como esto http://www.jardinesoftware.net/2007/10/23/hide-properties-in-bindinglist/ pero no da más detalles y no acaba de entender cómo escribió es usado. – sarsnake

1

he manejado esto unas cuantas maneras diferentes, es de esperar que esto sea útil.

La primera opción, como mencionó Justin, es establecer AutoGennerateColumns = false, y hacerlo manualmente desde allí. Si lo vincula, el tiempo de ejecución creará columnas para todas las propiedades públicas de Sample. Si desea eliminarlos, se puede hacer eso con

DataGridView.Columns["SomePropertyOfSample"].Remove(); 

Esta solución es un poco problemático, como sea necesario para mantenerlo actualizado, y eliminar explícitamente artículos.

Justin's Edit 2 La opción 2 de establecer el atributo Browsable en false en la propiedad es interesante, no lo he intentado antes.

La solución que he terminado usando, y que creo que funciona bastante bien, gira en torno a una interfaz.

Tenía dos DataGridViews diferentes que necesitaban mostrar los mismos datos, pero que mostraban y ocultaban diferentes columnas cada vez. En este caso puede hacer:

public interface ISimpleSample 
{ 
    string Name {get;} 
    int ID {get;} 
} 

public interface IAdvancedSample 
{ 
    string Name {get; set;} 
    int ID {get; set;} 
    string Make {get; set;} 
    string Model {get; set;} 
} 

public class Sample : ISimpleSample, IAdvancedSample 
{ 
    //Implementation skipped 
} 

A continuación, crear su colección de muestras mediante

BindingList<ISimpleSample> = new BindingList<ISimpleSample>(); 

y se unen a eso.

Si desea agregar columnas más tarde, simplemente agréguelas a la interfaz adecuada.

Esto funcionó bien para mi proyecto, déjame saber lo que piensas.

Cuestiones relacionadas