none
WPF: Validacion en DATAGRID RRS feed

  • Pregunta

  • Hola!

    Tengo un grid al cual le estoy aplicando validaciones, y me valida a la perfección, el problema es que tengo un boton de ok que me guarda todos los cambios en el grid, ahora bien, como puedo saber programaticamente que mi grid no tiene errores....me gustaria hacer

    buttonCommand pero no se como saber si mi validacion tiene errores...

    

    ValidationError

    ruleError = migrid.GetBindingExpression(DataGrid. ????? ).ValidationError;

    alguna idea?? muchas gracias!!

    martes, 9 de agosto de 2011 12:07

Todas las respuestas

  • Hola Shere.

    Hace tiempo hablamos de la validacion y de como implementar reglas, te pongo los links por si no los has encontrado:

    implementar reglas:

    http://social.msdn.microsoft.com/Forums/es-xl/wpfes/thread/1f6c2c6f-18df-44ab-b7c7-06ad15e1bed4

    invocar validacion con el getBindingExpression

    http://social.msdn.microsoft.com/Forums/es-AR/wpfes/thread/774402e1-2d6a-476a-8196-a8d089695fdb

     

    En un principio tu linea seria algo asi:

    // obtener error de la regla de validacion en caso de existir
    ValidationError ruleError = txtUsername.GetBindingExpression(TextBox.TextProperty).ValidationError;
    
    // si existe error en el modelo o en la regla de validacion, el comando no se ejecuta
    if (true == error || null != ruleError) e.CanExecute = false;
    // sin error se puede ejecutar el comando
    else e.CanExecute = true;
    

    donde la propiedad TextBox.TextProperty, seria la propiedad de dependencia donde tengas implementada la validacion.

    Aunque todo esto depende de como tengas el sistema de validacion, si esto no te ayuda, puedes poner el codigo xaml de la validacion y tu regla para ver como lo tienes implementado.

    Ya contaras que tal.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    martes, 9 de agosto de 2011 17:13
  • Hola David...si me acuerdo y precisamente lo quise hacer igual....el problema es que en esta ocasion es un datagrid y lo que quiero validar es un campo en el data grid...y no se como poner lo de GetBindingExpression para ese campo en el datagrid.

     

    Gracias de antemano

    miércoles, 10 de agosto de 2011 8:32
  • Nadie tiene idea??

    gracias de antemano

    jueves, 11 de agosto de 2011 7:39
  • Hola shere.

    ¿Puedes poner el codigo xaml del datagrid?

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    jueves, 11 de agosto de 2011 11:40
  • Hola david

    este es el codigo del grid

              <DataGrid Name="grdEnvois" IsSynchronizedWithCurrentItem="True" VerticalScrollBarVisibility="auto" HorizontalScrollBarVisibility="Auto" CanUserReorderColumns="False" CanUserSortColumns="False" AutoGenerateColumns="False" Background="White" Width="250" Margin="0" Padding="0" ColumnWidth="" dxlc:ScrollBox.Left="0" dxlc:ScrollBox.Top ="0" MinHeight ="50" ItemsSource="{Binding}" GridLinesVisibility="All" HorizontalGridLinesBrush="#FFCBC5C5" VerticalGridLinesBrush="#FFCBC5C5" Foreground="#FF000092" dxlc:DockLayoutControl.AllowHorizontalSizing="True" dxlc:DockLayoutControl.AllowVerticalSizing="True" CanUserAddRows="False"  CanUserDeleteRows="False" SelectionChanged="grdEnvois_SelectionChanged" LoadingRow="grdEnvois_LoadingRow" UnloadingRow="grdEnvois_UnloadingRow" CellEditEnding="grdEnvois_CellEditEnding">
                <DataGrid.Resources>
                  <Style x:Key="datagridElemStyle" TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                      <Trigger Property="Validation.HasError" Value="True">                    
                        <Setter Property="Foreground" Value="Red" />
                        <Setter Property="ToolTip" 
                         Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                      </Trigger>
    
                    </Style.Triggers>
                  </Style>
                  
                </DataGrid.Resources>
    
                <DataGrid.Columns>
    
                  <DataGridTextColumn Header="Nº Envoi"  EditingElementStyle="{StaticResource datagridElemStyle}"
                       Width="60" MinWidth="60" IsReadOnly="False" 
                       Binding="{Binding Path=NEnvois, ValidatesOnDataErrors=True, Mode=TwoWay}"/>
    
                    <DataGridTemplateColumn Header="Nº Article" Width="60" IsReadOnly="True">
                      <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                          <TextBlock Text="{Binding Path=ID_STOCKS}" 
                            HorizontalAlignment="{Binding Path=ID_STOCKP, Converter={StaticResource CoposedToPositionConverter}}">
                          </TextBlock>
                        </DataTemplate>
                      </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Description" Width="*" MinWidth="100" IsReadOnly="True" Binding="{Binding Path=STK_DESCRIPTION}"/>
                    <DataGridTextColumn Binding="{Binding Path=ID_STOCKP}" Header="ID_STOCKP" Visibility="Collapsed" />
                    <DataGridTextColumn Header="DisplayedOrder" Visibility="Hidden" Width="1" Binding="{Binding Path=DisplayedOrder}" />
                    
                  </DataGrid.Columns>
                </DataGrid>


    El dataTemplate del numero de articulo es otra historia que me funciona a la perfección.

    El problema lo tengo en el NEnvois...que tiene que ser menos a un numero dado... (es un valor que puedo modificar en el mismo grid)

    visualmente me valida bien...que por cierto...me valida cuando clico en otro row...y no estaria mal que me valdiase cuando cliko en otra columna (por pedir jajaja)....

    el problema esta que tengo un boton save que lo quiero hacer command button....igual que el ejemplo del textbox de la otra vez...pero no se como ponerla la propiedad al metodo GetBindingExpression para saber si la validacion contiene errores o no...

     

    Gracias de antemano

    viernes, 12 de agosto de 2011 7:39
  • Hola Shere.

    No has puesto el enlace del datagrid, no obstante supongo que tendras enlazados los datos mediante la propiedad ItemSource, de modo que puedes intentar hacer algo asi:

    datagrid.GetBindingExpression(DataGrid.ItemsSourceProperty).ValidationError
    

    Ya contaras si esto te sirve.

     

     

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    sábado, 13 de agosto de 2011 10:35
  • Si lo tengo bindeado...y el grid tiene un elemento...pero a la hora de hacer

    ValidationError

     

    ruleError = grdEnvois.GetBindingExpression(DataGrid

    .ItemsSourceProperty).ValidationError;

    me da el siguiente error: Referencia a objeto no establecida como instancia de un objeto.

     

    gracias

    martes, 16 de agosto de 2011 9:54
  • Hola Shere.

    He estado fuera un tiempo y no he podido responder. ¿has solucionado el problema?.

    He visto el codigo de nuevo y veo lo siguiente:

    - El ValidationError, solo tendra algo si implementas un ValidationRule en el codigo, como en el siguiente post:

    http://social.msdn.microsoft.com/Forums/es-xl/wpfes/thread/1f6c2c6f-18df-44ab-b7c7-06ad15e1bed4

    Si no lo implementas, ValidationError sera null.

    - no he visto el codigo de validacion, pero creo que te apoyas en la interface IDataErrorInfo en los modelos, de ser asi, para ver los errores, puedes acceder a la fuente de datos del grid para acceder al modelo concreto y consultar su propiedad Error o la propiedad indizada con el nombre de la propiedad a verificar.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    martes, 23 de agosto de 2011 18:34