none
DataGrid - Eventos en la celda - equivalente CellEnter RRS feed

  • Pregunta

  • Existe el equivalente del CellEnter y CellLeave del datagridview en la grilla de WPF ?

    de ser pisible que devuelva la fila y columna de la celda qe lanza el evento

    veo que hay muchos eventos en el control datagrid pero ninguno opera a nivel de la celda, que seran del tipo DataGridTextColumn

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 3 de mayo de 2010 16:36

Respuestas

  • Hola Leandro.

    Te vas a reir por que estabas muy cerca, pero te falta definir el recurso, en definitiva, puedes definir el estilo en el mismo documento de 2 formas:

    En los recursos de la ventana:

    <Window.Resources>
      <Style TargetType="{x:Type DataGridCell}">		
        <EventSetter Event="MouseEnter" Handler="gridDatos_MouseEnter"/>
      </Style>
    </Window.Resources>

    o si lo quieres definir bajo el control, en los recursos del control:

      <DataGrid x:Name="gridDatos" ItemsSource="{Binding XPath=/documento/Bars/Bar}"
             AutoGenerateColumns="False" CanUserAddRows="False">
        	
          <DataGrid.Resources>      
            <Style TargetType="{x:Type DataGridCell}">
              <EventSetter Event="MouseEnter" Handler="gridDatos_MouseEnter"/>
            </Style>
          </DataGrid.Resources>
    
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codigos" Width="50*" />
    
          <DataGridTemplateColumn Header="Descripcion" Width="50*" >
            <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <TextBlock Text="" Tag="" />
              </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
        </DataGrid.Columns>
        </DataGrid>

     

     


    Saludos
    David González
    jueves, 6 de mayo de 2010 8:25

Todas las respuestas

  • hola

    le comento estuve avanzando un poco en el tema y encontre algunas tentativas de solucion, pero igual no me concencen del todo

     

    algo que intente usar el el tag Style

     

    <DataGrid  x:Name="GridCodes" ItemsSource="{Binding}"
                                 AutoGenerateColumns="False" SelectionChanged="GridCodes_SelectionChanged" >

            <Style  TargetType="{x:Type DataGridCell}">
                <EventSetter Event="MouseEnter"  Handler="GridCodes_MouseEnter"/>
            </Style>

            <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codes" Width="100*"  />
            <DataGridTextColumn Binding="{Binding Path=Desc}" Header="Desc" Width="100*"  />
        </DataGrid.Columns>
    </DataGrid>

     

    si bien compila, cuando carga explota con un error que no esta muy claro, es mas no tengo el mensaje del mismo, pero si quito el Style funciona perfectamente

     

    Otra alternativa que estos evaluendo es usar algo como esto:

     

    <DataGrid  x:Name="GridCodes" ItemsSource="{Binding}"
                                 AutoGenerateColumns="False" SelectionChanged="GridCodes_SelectionChanged" >

        <DataGrid.Columns>
            <DataGridTemplateColumn Header="PopUp Column" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Cod}" Background="Blue" MouseEnter="TextBlock_MouseEnter" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codes" Width="100*"  />
            <DataGridTextColumn Binding="{Binding Path=Desc}" Header="Desc" Width="100*"  />
        </DataGrid.Columns>
    </DataGrid>

     

    o sea un DataGridTemplateColumn  con un TextBlock y que este tenga el evento del mouse enter, funciona bien, pero el tema es que no se tiene acceso al contenido de la row, para acceder a las otras celdas, o sea no se tiene el RowIndex

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 4:15
  • Hola Leandro.

    la verdad es que en ocasiones el DataGrid puede ser algo engorroso ya que como dices no opera a nivel de celda si no con la vista de las filas.

    aun asi, tienes 2 eventos, uno para el comienzo de edicion y otro para el final de la edicion, que son 'BeginningEdit' y 'CellEditEnding' respectivamente.

    por otro lado, si estos no te sirven vas a tener que personalizar el grid con las plantillas de columnas. Hace un tiempo hable bastante del tema en algunos post, he encontrado este que creo que engloba bastantes cosas y te puede ayudar a personalizar las plantillas y eventos:

    http://social.msdn.microsoft.com/Forums/es-ES/wpfes/thread/8e456eb2-95d8-46e7-bb03-8200bb1f33b6

     

    Ya me contaras que tal.


    Saludos
    David González
    martes, 4 de mayo de 2010 9:58
  • hola

    gracias por la ayuda

    ese link que me pasas es justo uno que habia visto, lo tenia como referencia.

     

    Te comento a donde apunto con el mouse enter de la celda, resulta que como imaginaras equi esta la integracion entre el datagrid y el PopUp.

    Es por eso que no veo como usar en este caso particular el BeginningEdit y CellEditEnding

    lo que estoy usando ahora es algo como esto

            <DataGrid  x:Name="gridDatos" ItemsSource="{Binding}"
                                 AutoGenerateColumns="False" CanUserAddRows="False">
               
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codigos" Width="50*"  />
                    <DataGridTemplateColumn Header="Descripcion"  Width="50*" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Desc}" Tag="{Binding Path=Cod}" MouseEnter="TextBlock_MouseEnter" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

     

            private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
            {

                customPopUp.CurrentItem = ((TextBlock)sender).Tag;

                customPopUp.Show();
            }

     

    y la verdad funciona

     

    pero me hubiera guatado que funcionara con

       <Style  TargetType="{x:Type DataGridCell}">
                <EventSetter Event="MouseEnter"  Handler="GridCodes_MouseEnter"/>
       </Style>

     

    asi podia usar los DataGridTextColumn

    pero bueno una solucion al menos tengo andando

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 4 de mayo de 2010 19:29
  • Hola Leandro.

    yo he probado con el Style y si que me funciona, si el dataTemplate lo tienes definido como arriba, quitale el evento al TextBox y te tiene que funcionar correctamente.


    Saludos
    David González
    miércoles, 5 de mayo de 2010 16:10
  •  

    hola

    mmm que raro lo estoy probando de esta forma:

            <DataGrid  x:Name="gridDatos" ItemsSource="{Binding}"
                                 AutoGenerateColumns="False" CanUserAddRows="False">

                <Style  TargetType="{x:Type DataGridCell}">
                    <EventSetter Event="MouseEnter"  Handler="gridDatos_MouseEnter"/>
                </Style>
               
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codigos" Width="50*"  />
                   
                    <DataGridTemplateColumn Header="Descripcion"  Width="50*" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Desc}" Tag="{Binding Path=Cod}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

     

        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }


            private DataTable GetDatos()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Cod");
                dt.Columns.Add("Desc");

                DataRow row = dt.NewRow();
                row["Cod"] = 1;
                row["Desc"] = "Desc 1";
                dt.Rows.Add(row);

                row = dt.NewRow();
                row["Cod"] = 2;
                row["Desc"] = "Desc 2";
                dt.Rows.Add(row);

                row = dt.NewRow();
                row["Cod"] = 3;
                row["Desc"] = "Desc 3";
                dt.Rows.Add(row);

                row = dt.NewRow();
                row["Cod"] = 4;
                row["Desc"] = "Desc 4";
                dt.Rows.Add(row);

                row = dt.NewRow();
                row["Cod"] = 5;
                row["Desc"] = "Desc 5";
                dt.Rows.Add(row);

                row = dt.NewRow();
                row["Cod"] = 6;
                row["Desc"] = "Desc 6";
                dt.Rows.Add(row);

                return dt;

            }


            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                gridDatos.DataContext = GetDatos().DefaultView;
               
            }


            private void gridDatos_MouseEnter(object sender, MouseEventArgs e)
            {

            }

        }

     

    pero el error que visualizo es:

    Items collection must be empty before using ItemsSource.

     

    como lo has podido hacer andar en tu caso, es algo similar a esto

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 5 de mayo de 2010 19:16
  • Hola Leandro.

    Te vas a reir por que estabas muy cerca, pero te falta definir el recurso, en definitiva, puedes definir el estilo en el mismo documento de 2 formas:

    En los recursos de la ventana:

    <Window.Resources>
      <Style TargetType="{x:Type DataGridCell}">		
        <EventSetter Event="MouseEnter" Handler="gridDatos_MouseEnter"/>
      </Style>
    </Window.Resources>

    o si lo quieres definir bajo el control, en los recursos del control:

      <DataGrid x:Name="gridDatos" ItemsSource="{Binding XPath=/documento/Bars/Bar}"
             AutoGenerateColumns="False" CanUserAddRows="False">
        	
          <DataGrid.Resources>      
            <Style TargetType="{x:Type DataGridCell}">
              <EventSetter Event="MouseEnter" Handler="gridDatos_MouseEnter"/>
            </Style>
          </DataGrid.Resources>
    
        <DataGrid.Columns>
          <DataGridTextColumn Binding="{Binding Path=Cod}" Header="Codigos" Width="50*" />
    
          <DataGridTemplateColumn Header="Descripcion" Width="50*" >
            <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <TextBlock Text="" Tag="" />
              </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
          </DataGridTemplateColumn>
        </DataGrid.Columns>
        </DataGrid>

     

     


    Saludos
    David González
    jueves, 6 de mayo de 2010 8:25
  • hola

    si tienes toda la razon, ahora funciona perfecto

     

    muchas gracias, la verdad te pasaste

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 6 de mayo de 2010 17:32
  • Hola

    Yo estoy intentando hace algo parecido pero con el LostFocus

    <Style TargetType="{x:Type DataGridCell}">
                <EventSetter Event="LostFocus" Handler="dg_Cuadrante_LostFocus"/>
            </Style>

    Pero no se que firma tiene que tener el menejador ya que solo me ofrece 2 tipos (DataGridCellEditEdndingEventArgs o DataGridCellClipboardEb¡ventArgs) y  ninguno me deja seguir adelante

    private void dg_Cuadrante_LostFocus(object sender, DataGridCellEditEndingEventArgs e)
            {            
              
            }

    Un saludo


    kintela @esekintela

    martes, 8 de julio de 2014 13:23