valor una recorrer obtener columnas celda aspxgridview c# wpf datagrid

una - recorrer columnas gridview devexpress c#



Columna Select de DataGrid (1)

Un enfoque más efectivo sería probablemente tener propiedades IsSelected en la clase DataSource, de modo que cada columna tenga una propiedad correspondiente "IsSelected".

public class MyData : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; Notify("Name"); } } private bool nameSelected = false; public bool NameSelected { get { return nameSelected; } set { nameSelected = value; Notify("NameSelected"); } } //... etc ... }

A continuación, puede modificar CellStyle para cada columna para vincular la propiedad IsSelected de las células a la propiedad IsSelected relacionada en la clase.

<DataGrid ItemsSource="{Binding Users}" AutoGenerateColumns="False" HorizontalAlignment="Left" Name="scratchGrid" CanUserAddRows="False" VerticalScrollBarVisibility="Auto" SelectionUnit="Cell"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Name}" Header="User Name" Width="200"> <DataGridTextColumn.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="IsSelected" Value="{Binding NameSelected}" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> <DataGridTextColumn Binding="{Binding Age}" Header="User Age" Width="80"> <DataGridTextColumn.CellStyle> <Style TargetType="{x:Type DataGridCell}"> <Setter Property="IsSelected" Value="{Binding AgeSelected}" /> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>

Finalmente, implemente su código select-all como así (esto selecciona-todo en Age, puede que quiera hacer una implementación más genérica / elegante;)):

foreach (MyData user in Users) { user.AgeSelected = true; }

Deberá asegurarse de que todo su comportamiento NotifyPropertyChanged esté alineado, ya que espera que la cuadrícula reconozca que las propiedades dentro de su colección enlazada se están actualizando.

Estoy tratando de seleccionar programáticamente una columna completa en WPF DataGrid. Mi código parece funcionar pero es REALMENTE lento. Supongo que es porque continuamente tiene que llamar a ScrollIntoView. ¿Alguien puede ayudarme con una solución para acelerarla o una alternativa para seleccionar toda la columna?

public static void SelectColumn(DataGrid grid, int column) { for (int i = 0; i < grid.Items.Count; i++) { // Select each cell in this column var cell = DataGridHelper.GetCell(grid, i, column); if (cell != null) { cell.IsSelected = true; } } DataGridHelper.GetCell(grid, 0, column).Focus(); } public static DataGridCell GetCell(DataGrid grid, int row, int column) { DataGridRow rowContainer = GetRow(grid, row); if (rowContainer != null) { DataGridCellsPresenter presenter = TreeHelper.GetVisualChild<DataGridCellsPresenter>(rowContainer); if (presenter == null) { // may be virtualized, bring into view and try again grid.ScrollIntoView(rowContainer, grid.Columns[column]); presenter = TreeHelper.GetVisualChild<DataGridCellsPresenter>(rowContainer); } if (presenter != null) { // try to get the cell but it may possibly be virtualized DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); if (cell == null) { // may be virtualized, bring into view and try again grid.ScrollIntoView(rowContainer, grid.Columns[column]); cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); } return cell; } } return null; } public static DataGridRow GetRow(DataGrid grid, int index) { DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); if (row == null) { // may be virtualized, bring into view and try again grid.ScrollIntoView(grid.Items[index]); row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index); } return row; }

ACTUALIZAR :

Estoy probando la solución sugerida por @ianschol. Esto es lo que tengo (ato el código detrás de b / c. No sé cuántas columnas necesito hasta el tiempo de ejecución):

for (int i = 0; i < this.CurrentData.Data[0].Length; i++) { TheGrid.Columns.Add( new DataGridTextColumn { Header = (this.CurrentData.Rank > 1) ? string.Format(this.culture, headerFormatString, i + 1) : string.Empty, Binding = new Binding(string.Format("[{0}].DataValue", i)) { ValidatesOnDataErrors = true, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }, Width = DataGridLength.Auto, ElementStyle = new Style { TargetType = typeof(TextBlock), Triggers = { this.errorTrigger } }, EditingElementStyle = new Style { TargetType = typeof(TextBox), Triggers = { this.errorTrigger } }, CellStyle = new Style { TargetType = typeof(DataGridCell), Setters = { new Setter { Property = DataGridCell.IsSelectedProperty, Value = new Binding(string.Format("[{0}].IsSelected", i)) { Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }, } }, } }); }

y mi propiedad IsSelected:

private bool isSelected = false; public bool IsSelected { get { return this.isSelected; } set { this.isSelected = value; OnPropertyChanged("IsSelected"); } }

Y el nuevo código SelectColumn:

public static void SelectColumn(DataGrid grid, int column) { for (int i = 0; i < grid.Items.Count; i++) { // Select each cell in this column ((DataItem[])(grid.Items[i]))[column].IsSelected = true; } }

El problema es que si actualizo la propiedad IsSelected en el código, actualiza la GUI (un poco, es peculiar) pero no al revés. Es decir, si selecciono una celda / fila en la GUI, no llama a la propiedad setter en el código. Como puede ver, el enlace es TwoWay, así que no estoy seguro del problema.

Otra ACTUALIZACIÓN: El problema parece ser con la virtualización. Si apago la virtualización (VirtualizingStackPanel.IsVirtualizing = "False") funciona bien.