none
Filas y columnas dinámicas en DataGrid y por cada celda escribir desde un control WPF RRS feed

  • Pregunta

  • Hola a todos, soy nuevo en WPF y estoy intentando crear un DataGrid con 4 columnas definidas "Información de boletos", "Nombre", "Email" y "Código Postal". Lo que hago es lo siguiente:

    System.Data.DataTable table = new System.Data.DataTable();
    
            table.Columns.Add("Información de Boletos");
            table.Columns.Add("Nombre");
            table.Columns.Add("Email");
            table.Columns.Add("ZipCode");

    Posteriormente pretendo generar filas de manera automática dependiendo de un número dado por el usuario, esta cantidad la guardo en una variable y la utilizo en un ciclo para generar las filas de esta manera:

    int cantidad = (int)Application.Current.Resources["NumPeopleQuantity"];
            for (int i = 0; i < cantidad; i++)
            {
                // crear la fila
                System.Data.DataRow row = table.NewRow();
    
                row["Información de Boletos"] = i + 1;
                row["Nombre"] = "";
                row["Email"] = "";
                row["ZipCode"] = "";
    
                // insertar la fila en la tabla
                table.Rows.Add(row);
            }

    Al final relaciono la tabla al Data grid que he creado de la siguiente manera:

    Grid1.ItemsSource = ((System.ComponentModel.IListSource)table).GetList();

    Esto funciona correctamente y se agregan las columnas y filas deseadas al DataGrid. Hasta aquí todo perfecto, puedo escribir un nombre, email y código postal por cada fila desde el teclado de mi computadora, cuando la información se ha llenado correctamente tengo un botón que recupera todo el contenido del dataGrid y lo asigna a un modelo para poder manipularlo en código, lo hago de la siguiente manera:

    System.Data.DataView data = (System.Data.DataView)Grid1.ItemsSource;
    
    
            var f = (PaymentViewModel)DataContext;
    
            string expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    
            for (int i = 0; i < data.Count; i++)
            {
                obj = new DataContactTicket
                {
                    CustomerName = data.Table.Rows[i]["Nombre"].ToString(),
                    CustomerEmail = data.Table.Rows[i]["Email"].ToString(),
                    CustomerZip = data.Table.Rows[i]["ZipCode"].ToString()
    
                };
                if (obj.CustomerName == "" || obj.CustomerEmail == "" || obj.CustomerZip == "")
                {
                    f.Mensaje = "Los campos de información de ticket no pueden estar vacíos";
                    return;
                }
                else
                {
    
                    if (Regex.IsMatch(obj.CustomerEmail, expresion))
                    {
                        if (Regex.Replace(obj.CustomerEmail, expresion, String.Empty).Length == 0)
                        {
                            nombres.Add(obj);
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        f.Mensaje = "Favor de validar el formato de correo electrónico";
                        return;
                    }
                }
            }
    
    
    
            f.Grid1 = nombres;

    Hago las validaciones correspondientes y los asigno a una lista en mi ViewModel, todo está correcto, el problema que tengo es que tengo la necesidad de que el usuario escriba esta información desde un onScreenKeyboard y no desde el teclado de una computadora para los textbox es fácil, la referencia queda así:

    <TextBox x:Name="TxtMail" Height="auto"  Width="500"  FontSize="24" FontWeight="Bold" TextChanged="TxtMail_TextChanged"
                            Text="{Binding Text, ElementName=onScreenKeyboard}"/>
    
     <Grid HorizontalAlignment="Stretch" Margin="114,-208,-114,208">
                    <StackPanel HorizontalAlignment="Left" Margin="-132,240,0,-240">
                        <TermControls:OnScreenKeyboard x:Name="onScreenKeyboard" HorizontalContentAlignment="Stretch"  VerticalAlignment="Bottom" VerticalContentAlignment="Bottom" Grid.ColumnSpan="3"  Grid.Row="1" Grid.RowSpan="4" />
                    </StackPanel>

    La idea es que por cada celda del dataGrid que el usuario seleccione pueda escribir también a través del control en ella, no he encontrado una manera de hacer esto. Espero que puedan ayudarme, muchas gracias.

    viernes, 23 de agosto de 2019 16:34