2009-08-18 3 views
6

¿Cómo se obtiene el contenido de una sola celda de un juego de herramientas de WPF DataGrid en C#?WPF DataGrid: ¿Cómo se obtiene el contenido de una sola célula?

Por contenido me refiero a un texto sin formato que podría estar allí.

+0

Sé que puede sonar simple para algunos, pero soy nuevo en WPF y he intentado hacer algo parecido en Forms con DataGridView y no he podido hacer nada similar. ¡Entonces una solución detallada sería realmente apreciada! – Partial

+0

Quizás no sea tan simple después de todo ... – Partial

+0

Creo que usaré un DataGridView de Forms con la ayuda de WindowsFormsIntegration ... – Partial

Respuesta

6

Siguiendo lo que Phillip dijo, el DataGrid suele estar vinculado a los datos. A continuación se muestra un ejemplo en el que mi WPF DataGrid está vinculado a un ObservableCollection<PersonName> donde un PersonName se compone de un FirstName y LastName (ambas cadenas).

El DataGrid admite la creación automática de columnas, por lo que el ejemplo es bastante simple. Verá que puedo acceder a las filas por su índice y obtener el valor de una celda en esa fila usando el nombre de la propiedad que corresponde al nombre de la columna.

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      // Create a new collection of 4 names. 
      NameList n = new NameList(); 

      // Bind the grid to the list of names. 
      dataGrid1.ItemsSource = n; 

      // Get the first person by its row index. 
      PersonName firstPerson = (PersonName) dataGrid1.Items.GetItemAt(0); 

      // Access the columns using property names. 
      Debug.WriteLine(firstPerson.FirstName); 

     } 
    } 

    public class NameList : ObservableCollection<PersonName> 
    { 
     public NameList() : base() 
     { 
      Add(new PersonName("Willa", "Cather")); 
      Add(new PersonName("Isak", "Dinesen")); 
      Add(new PersonName("Victor", "Hugo")); 
      Add(new PersonName("Jules", "Verne")); 
     } 
    } 

    public class PersonName 
    { 
     private string firstName; 
     private string lastName; 

     public PersonName(string first, string last) 
     { 
      this.firstName = first; 
      this.lastName = last; 
     } 

     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 
    } 
} 
+0

¡Gracias! Sabía que tenía que haber alguna forma ... Un poco más complicado que un DataGridView de Forms pero WPF no es tan maduro como Forms. – Partial

+0

No hay problema. Creo que Xceed (de terceros) DataGrid usa la construcción DataGridView. –

+0

'public string FirstName {get; conjunto; } cadena pública LastName {get; conjunto; } ' Convierta en propiedad automática: D – TheGeekZn

1

Normalmente, el contenido de una celda DataGrid está vinculado a datos y, por lo tanto, refleja el estado de una propiedad (en la mayoría de los casos) de un objeto que se muestra en una fila determinada. Por lo tanto, podría ser más fácil acceder al modelo que a la vista.

Habiendo dicho eso (acceda a la vista de modelo no), mi pregunta es: ¿qué está tratando de hacer? ¿Está buscando formas de recorrer el árbol visual para encontrar el control (o controles) que se representa en la pantalla? ¿Cómo espera hacer referencia a la celda, por índice de fila y columna?

+0

Por ejemplo, con un Formms DataGridView puedes hacer algo como esto: string cellContent = dataGridView1.Rows [0] .Cells [1] .ToString(); – Partial

+0

¿Cómo se puede hacer algo similar con una cuadrícula de datos WPF? – Partial

+0

Y sí, quiero poder obtener un índice de celda por fila y columna. – Partial

1

Si vincula utilizando una DataTable, puede obtener DataRowView desde la propiedad de la fila.

DataRowView rowView = e.Row.Item as DataRowView;