vacia - seleccionar una celda de un datagridview c#
¿Cómo incluyo una fila personalizada al final de un DataGrid en Silverlight? (3)
Resolví mi problema anoche en una ráfaga de inspiración. Noté que nadie más ha votado esta pregunta, por lo que esta respuesta puede no ser útil para nadie, pero por las dudas.
En primer lugar, combiné mi control de fila personalizado y RowsPresenter en una grilla de dos filas, cada fila clasificada en Auto. Luego coloqué la cuadrícula dentro de ScrollViewer y luego dimensioné la fila del visor de desplazamiento en el tamaño Star. No agregué la plantilla de la plantilla VerticalScrollbar en mi plantilla, ya que solo se desplaza por RowsPresenter.
Esto me dio el comportamiento exacto que estaba buscando donde se agrega una fila y la fila personalizada permanece anclada en la parte inferior de la última fila de datos. Cuando las filas y la fila personalizada se desbordan al final del área visible, la barra de desplazamiento aparece para permitir el desplazamiento mientras se mantienen los encabezados fijos en su lugar.
Trabajo hecho. Espero que alguien encuentre esto útil. Debajo está mi ControlTemplate XAML.
<ControlTemplate TargetType="swcd:DataGrid" x:Key="DataGridTemplate">
<Border
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid Name="Root" Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<swcdp:DataGridColumnHeader Name="TopLeftCornerHeader" Grid.Column="0"/>
<swcdp:DataGridColumnHeadersPresenter Name="ColumnHeadersPresenter" Grid.Column="1"/>
<swcdp:DataGridColumnHeader Name="TopRightCornerHeader" Grid.Column="2"/>
<ScrollViewer
Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="1"
Padding="0,0,0,0"
BorderThickness="0,0,0,0"
VerticalScrollBarVisibility="Auto">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<swcdp:DataGridRowsPresenter Name="RowsPresenter" Grid.Row="0" />
<Border
Margin="1,1,1,1"
Padding="2,2,2,2"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Grid.Row="1">
<Grid Background="{TemplateBinding Background}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock
Grid.Row="0"
TextAlignment="Left"
TextWrapping="NoWrap"
Text="Add a new item using the lists below:" />
<mystuff:MySelectionControl
HorizontalContentAlignment="Stretch"
Grid.Row="1"
SelectionChanged="OnSelectionChanged"/>
</Grid>
</Border>
</Grid>
</ScrollViewer>
<Rectangle Name="BottomLeftCorner" Grid.Row="3" Grid.ColumnSpan="2" />
<Grid Grid.Column="1" Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Rectangle Name="FrozenColumnScrollBarSpacer" />
<ScrollBar Name="HorizontalScrollbar" Grid.Column="1" Orientation="Horizontal" Height="18" />
</Grid>
<Rectangle Name="BottomRightCorner" Grid.Column="2" Grid.Row="3" />
</Grid>
</Border>
</ControlTemplate>
Tengo un DataGrid
en mi aplicación de Silverlight y funciona muy bien, agregando una fila o eliminando una fila mientras manipulo la colección ItemsSource
. Sin embargo, quiero que haya una fila adicional o control que siempre aparece después de la última fila de datos.
Puedo obtener el control adicional para que aparezca después de la última fila usando ControlTemplate
y estableciendo la fila RowsPresenter en Auto height, pero esto significa que las filas nunca se desplazan cuando el área de renderizado se vuelve demasiado pequeña. Sin embargo, si cambio la altura de la fila de RowsPresenter a Estrella, las filas se desplazan pero el control adicional aparece anclado en la parte inferior de la cuadrícula de datos en lugar de en la parte inferior de la última fila.
¿Hay alguna manera de que pueda tener el comportamiento de altura de estrella en el RowsPresenter mientras sigo teniendo mi control de la manera que quiero?
Mi pensamiento actual es que necesito usar de alguna manera el evento LoadingRow para encontrar la posición de la última fila y usar un lienzo o similar para colocar mi control en la ubicación adecuada.
¿Pensamientos?
Gracias de antemano por la ayuda.
Actualizar
También hice una pregunta (y finalmente respondí) sobre fijar un control debajo de otro, que podría usarse para solucionar este problema si no desea que la fila personalizada se desplace con el resto de las filas (como en mi caso, donde Quería otra fila de encabezado de la grilla de datos para mostrar totales y flotar sobre las otras filas).
No estoy seguro de si esto ayuda con Silverlight, pero agregué una fila de totales a un WGT DataGrid al agregar una columna invisible, llamada IsTotal. Pude hacer que esta fila siempre apareciera en la parte inferior de la cuadrícula usando agrupación / clasificación personalizada. El orden de agrupación / clasificación se configuró para usar esta columna como la clasificación principal, con una dirección de corrección. Parece que funciona bien.
Primero, crea una Cuadrícula para DataGrid y el control inmovilizado:
<Grid Grid.Row="0" VerticalAlignment="Top">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" />
<TextBlock Grid.Row="1" Text="Hello World" /> <!-- The pinned control. -->
</Grid>
El truco es VerticalAlignment = "Top": cuando DataGrid es más pequeño que la altura disponible, se moverá a la parte superior del espacio disponible y el control fijado aparecerá debajo de él.
Luego, coloque esta Rejilla en un contenedor que se extienda verticalmente, por ejemplo, en una fila de otra Rejilla con altura de Estrella:
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<!-- RowDefition for the Grid with the DataGrid with the pinned control. -->
<!-- If you want to have some other controls, -->
<!-- add other RowDefinitions and put these controls there. -->
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- The internal Grid for the DataGrid & the pinned control. -->
<Grid Grid.Row="0" VerticalAlignment="Top">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" />
<TextBlock Grid.Row="1" Text="Hello World" /> <!-- The pinned control. -->
</Grid>
</Grid>
En lugar de la cuadrícula raíz, puede tener cualquier otro contenedor que se extienda verticalmente, lo importante es que intenta llenar todo el espacio disponible para ello.