最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

c# - Edit DataGrid in another window without auto update - Stack Overflow

programmeradmin5浏览0评论

I have a read only DataGrid in MainWindow populated with a list of a custom type. I want to edit each row separately in another window that uses TextBoxes. I get to bind everything correctly, but I can see how de DataGrid gets updated simultaneously in the background when I change a TextBox. I want it to update when I click on my save button, so I can validate the new values.

XAML of Datagrid:

      <DataGrid x:Name="dgCb" Grid.Row="0" 
                  BorderBrush="{DynamicResource Vetrotec.AzulOscuro}" 
                  Background="{DynamicResource Vetrotec.AzulFondoTabla}"
                  AutoGenerateColumns="False"
                  CanUserReorderColumns="False" 
                  CanUserSortColumns="False"
                  CanUserAddRows="False"
                  CanUserDeleteRows="False"
                  IsReadOnly="True"
                  SelectionUnit="FullRow"
                  SelectionMode="Single"
                  Language="es-ES">
            
            <DataGrid.ColumnHeaderStyle>
                <Style TargetType="DataGridColumnHeader">
                    <Setter Property="FontFamily" Value="Arial"/>
                    <Setter Property="FontSize" Value="14"/>
                    <Setter Property="FontWeight" Value="Bold"/>
                    <Setter Property="HorizontalContentAlignment" Value="Center" />
                </Style>
            </DataGrid.ColumnHeaderStyle>
            
            <DataGrid.Columns>
                <DataGridTextColumn Header="Pos." Width="0.35*" IsReadOnly="True"
                                    Binding="{Binding Posicion}" />
                <DataGridComboBoxColumn x:Name="colCodigo" Header="Codigo" Width="0.75*" 
                                        SelectedValueBinding="{Binding IdMaterial}" 
                                        DisplayMemberPath="Codigo"
                                        SelectedValuePath="Id" />
                <DataGridComboBoxColumn x:Name="colDescripcion" Header="Descripcion" Width="2*" 
                                        SelectedValueBinding="{Binding IdMaterial}" 
                                        DisplayMemberPath="Descripcion"
                                        SelectedValuePath="Id" />
                <DataGridTextColumn Header="Cant."  Width="0.5*"  
                                    Binding="{Binding Cantidad}" />
                <DataGridTextColumn Header="Ancho" Width="0.5*" 
                                    Binding="{Binding Ancho}" />
                <DataGridTextColumn Header="Alto" Width="0.5*" 
                                    Binding="{Binding Alto}" />
                <DataGridTextColumn Header="Fecha Lote" Width="0.75*" 
                                    Binding="{Binding FechaLote, StringFormat=d}" />
                <DataGridTextColumn Header="Lote" Width="*" 
                                    Binding="{Binding Lote}" />
                <DataGridTextColumn Header="Proveedor" Width="*" 
                                    Binding="{Binding Proveedor}" />
            </DataGrid.Columns>
        </DataGrid>

Button to modify DataGrid row:

private void btnModificarLinea_Click(object sender, RoutedEventArgs e)
{
        if (dgCb.SelectedItem == null)
        {
            MessageBox.Show("No se ha seleccionado ninguna línea.");
            return;
        }

        string pathCodigos = Properties.Settings.Default.RutaCodigos;

        ModificarStock wModificarStock = new ModificarStock();
        wModificarStock.Tipo = ModificarStock.TipoModificacion.Modificar;
        wModificarStock.LineaStock = (Material)dgCb.SelectedItem;
        wModificarStock.Codigos = CodigosMaterial.ObtenerCodigos(pathCodigos, ';');
        wModificarStock.Closed += ModificarStock_Closed;
        wModificarStock.ShowDialog();
}

External window to modify DataGrid:

public partial class ModificarStock : Window
{
    public MainWindow.Material LineaStock { get; set; }
    public List<MainWindow.CodigosMaterial> Codigos { get; set; }
    public TipoModificacion Tipo { get; set; }
    public bool CambioAceptado { get; set; }

    public enum TipoModificacion
    {
        Insertar,
        Modificar
    }

    public ModificarStock()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        DataContext = LineaStock;
        cbIdMaterial.ItemsSource = Codigos;
        cbCodigo.ItemsSource = Codigos;
        cbDescripcion.ItemsSource = Codigos;

        if (Tipo == TipoModificacion.Modificar)
        {
            tbPosicion.IsEnabled = false;
        }
    }

    private void btnAceptar_Click(object sender, RoutedEventArgs e)
    {
        CambioAceptado = true;

        foreach (TextBox tb in MyGrid.Children.OfType<TextBox>())
        {
            if (Validation.GetHasError(tb))
            {
                MessageBox.Show("Se ha detectado un error en algún campo.");
                CambioAceptado = false;
            }
        }

        if (CambioAceptado)
        {
            Close();
        }
    }
 }
发布评论

评论列表(0)

  1. 暂无评论