Respondida insertar datos de TextBox a un DataGrid al pulsar un Boton

  • jueves, 31 de mayo de 2012 20:46
     
     

    Hola:

    Pues no hay mucho que decir, utilizo Vb 2010 y quiero ingresar datos al DataGrid por medio de TextBox y un boton.

    Saludos y muchas gracias.

Todas las respuestas

  • viernes, 01 de junio de 2012 21:30
     
     Respondida Tiene código

    Hola Luis.

    Bueno todo depende de como lo tengas implementado, por ejemplo algo asi te permite ir añadiendo elementos:

    codigo xaml:

        <Window.Resources>
            <!-- ViewModel con el contexto de datos -->
            <local:ViewModel x:Key="ViewModel" xmlns:local="clr-namespace:WpfApplication9" />
        </Window.Resources>
    
        <Grid DataContext="{StaticResource ViewModel}">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            
            <!-- Grid con los datos -->
            <DataGrid AutoGenerateColumns="True"  HorizontalAlignment="Left"  Name="dataGrid1" VerticalAlignment="Top" ItemsSource="{Binding UserModels}" />
    
            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <!-- insertar datos -->
                <TextBox Height="23" Name="textBox1" Width="120" Margin="10" />
                <TextBox Height="23" Name="textBox2" Width="120" Margin="10"/>
                <TextBox Height="23" Name="textBox3" Width="120" Margin="10"/>
                <Button Content="Añadir" Height="23" Name="button1" Width="75" Click="button1_Click" />
            </StackPanel>
        </Grid>

    y en el codigo cs se controla el boton para añadir elementos (y se define el viewmodel y el modelo)

    namespace WpfApplication9
    {
        /// <summary>
        /// Lógica de interacción para MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            /// <summary>
            /// Boton para añadir items en el grid
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                // obtener el contexto de datos del datagrid (que esta heredado del grid)
                ViewModel viewModel = (dataGrid1.DataContext as ViewModel);
                viewModel.UserModels.Add(new UserModel()
                {
                    Id = textBox1.Text,
                    Name = textBox2.Text,
                    Nick = textBox3.Text
                });
            }           
        }
    
        /// <summary>
        /// Clase conteniendo el viewModel de pruebas
        /// </summary>
        public class ViewModel : Base
        {
            /// <summary>
            /// Constructor por defecto de la clase
            /// </summary>
            public ViewModel()
            {
                // crear una lista vacia
                UserModels = new System.Collections.ObjectModel.ObservableCollection<UserModel>();
            }
    
            /// <summary>
            /// Lista con modelos de usuario
            /// </summary>
            public System.Collections.ObjectModel.ObservableCollection<UserModel> UserModels { get; set; }
        }
    
        /// <summary>
        /// Modelo con datos de un usuario
        /// </summary>
        public class UserModel
        {
            /// <summary>Id del usuario</summary>
            public string Id { get; set; }
            /// <summary>Nombre del usuario</summary>
            public string Name { get; set; }
            /// <summary>Nick del usuario</summary>
            public string Nick { get; set; }
        }
    
        /// <summary>
        /// Clase para usar como base para implementar notificacion de cambios de propiedades
        /// </summary>
        public class Base
        {
            /// <summary>
            /// Evento para suscribirse al cambio de una propiedad
            /// </summary>
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
            /// <summary>
            /// Funcion  para notificar un cambio de propiedad, de modo que se actualice el binding
            /// </summary>
            /// <param name="propertyName">Nombre de la propiedad a actualizar</param>
            public void NotifyPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
                }
            }
        }
    
    }
    

    Un datagrid es solo la representacion de una fuente de datos, de modo que como el grid lo tendras enlazado, no tienes que añadir al grid si no a los datos que estan enlazados al grid.


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

    • Marcado como respuesta Luis_Escobar martes, 05 de junio de 2012 0:25
    •  
  • viernes, 01 de junio de 2012 23:51
     
     

    Hola David antes que nada muchas gracias por tomar de tu tiempo para aclarar mis dudas, te comento lo siguiente.

    En VB para agregar datos a un DataGridView desde TextBox por medio del evento Click de un Boton basta con hacer lo siguiente.

    DataGridView.Rows.Add(TextBox1.Text, TextBox2.Text, TextBox3.Text)

    Cabe mencionar que el DGV no esta enlazado a ninguna fuente de datos y su DataSource = Nothing...

    Estoy en mi etapa inicial en WPF (kinderGarden :D), entonces el codigo y ejemplo que me proporcionas me resulta demasiado como para solo agregar filas a un DataGRid de ahi me surgen dos preguntas:

    1 ) para cualquier accion que yo quiera realizar con cualquier objeto en WPF necesariamente debo de modificar el XML?

    2) La forma que comento para agregar datos aun DataGRid no seria posible en WPF?

    Agradezco de antemano tu ayuda y comprension.


    Luis Escobar

  • sábado, 02 de junio de 2012 9:20
     
      Tiene código

    Hola Luis.

    VB y c# son lenguajes no tecnologias, lo que me comentas es lo que se hace en Winforms, ya que en WPF no existe el DataGridView.

    Ahora bien, si lo que quieres es trabajar como en Winforms, aunque puedes hacerlo no es nada recomendable ya que WPF es una tecnologia mas avanzada y adaptada a la programacion actual.

    En WPF los controles no contienen datos, hay que hacerse la idea de que un control solo es una representacion visual de datos y no contiene o no debiera contener ningun tipo de informacion, esto siempre ha debido de ser asi sobretodo al trabajar con arquitecturas basadas en capas, la capa de presentacion solo tiene que tener logica de presentacion y nada mas, en cuanto tega algun dato  especifico de negocio, estara estrechamente ligado y no se podran reutilizar y/o separar de el. Con WPF se pretende esta separacion.

    Con lo dicho, si tu metes a pelo los datos en un datagrid, los datos los tiene el propio control ¿que sentido tiene dejar toda la carga a un control? ¿como trabajas con los datos del propio control de forma ligera e independiente?.

    El problema que ha existido siempre es que cuando se permite hacer algo, la gente lo hace este bien o mal, o simplemente por la sencillez del proceso o tiempo que se tarda, un ejemplo de ello son los eventos, es muy sencillo crear un evento click para uno o mil botones e implementar su codigo dentro del evento, pero esto es lo peor que se puede hacer, ya que se fragmenta una logica que debiese estar unida por responsabilidades, en una aplicacion del tipo 'Hola mundo' esta bien, pero en una aplicacion con cierta complejidad a la larga sera desastroso y vendran los problemas.

    Bien, tras este pequeño rollo, te respondo:

    1.- el xaml es un lenguaje para extender el CLR y permitir definir controles y comportamientos en tiempo de diseño, es un lenguaje estatico, significa que no se puede modificar en tiempo de ejecucion (aunque si que se puede crear uno nuevo, parsearlo y cargarlo en el motor xaml para que lo interprete), pero como xaml es una extension, realmente todo lo que se puede escribir en XAML se puede hacer mediante un lenguaje como c# que a fin de cuentas es lo que hace el interprete con el xaml. De modo que desde codigo puedes cambiar cualquier control que hayas definido en el codigo XAML.

    (En winforms, la forma de trabajar es que tu vas añadiendo controles y modificando propiedades y se van creando en un archivo .designer, de modo que era como un asistente visual). WPF es algo mas parecido a ASPNET, el codigo xaml seria un equivalente al aspx y el code behind/beside es una clase parcial o de la cual se hereda (como ocurre en aspnet) y existe un interprete para xaml del mismo modo que existe para aspx.

    2.- la forma que comentas no se puede hacer exactamente del mismo modo, aunque si que se puede hacer de forma parecida, pero ateniendose a las consecuencias que he comentado al principio.

    por ejemplo el codigo se puede simplificar en esto:

        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            
            <!-- Grid con los datos -->
            <DataGrid AutoGenerateColumns="False"  HorizontalAlignment="Left"  Name="dataGrid1" VerticalAlignment="Top" >
                <DataGrid.Columns>
                    <DataGridTextColumn x:Name="idColumn" Binding="{Binding Path=Id}" Header="Id" Width="SizeToHeader" />
                    <DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name}" Header="Name" Width="SizeToHeader" />
                    <DataGridTextColumn x:Name="nickColumn" Binding="{Binding Path=Nick}" Header="Nick" Width="SizeToHeader" />
                </DataGrid.Columns>
            	
            </DataGrid>
    
            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <!-- insertar datos -->
                <TextBox Height="23" Name="textBox1" Width="120" Margin="10" />
                <TextBox Height="23" Name="textBox2" Width="120" Margin="10"/>
                <TextBox Height="23" Name="textBox3" Width="120" Margin="10"/>
                <Button Content="Añadir" Height="23" Name="button1" Width="75" Click="button1_Click" />
            </StackPanel>
            
        </Grid>

    Aqui el codigo del datagrid es mas amplio por que se tienen que definir las columnas que va a tener.

    en el codigo c# solo hay que ir añadiendo objetos de esas columnas:

            /// <summary>
            /// Boton para añadir items en el grid
            /// </summary>
            /// <param name="sender">objeto remitente</param>
            /// <param name="e">argumentos del evento</param>
            private void button1_Click(object sender, RoutedEventArgs e)
            {           
                dataGrid1.Items.Add(new
                {
                    Id = textBox1.Text,
                    Name = textBox2.Text,
                    Nick = textBox3.Text
                });
            }

    y con esto se iran añadiendo items. Luego se puede recuperar la coleccion Items y trabajar con ella.

    No obstante lo dicho, si tienes pensado comenzar a trabajar con WPF/Silverlight/Metro te recomiendo encarecidamente que comiences a plantearte desarrollar basandote en el patron mvvm ya que estas tecnologias estan pensadas para hacer uso del patron y te facilitaran la vida en las aplicaciones.

    "Me he extendido demasiado, no volvera a pasar ;)"


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

  • martes, 05 de junio de 2012 0:16
     
     

    Hola David, de nuevo agradesco demasiado la extensa explicacion pero sobre todo por tomar de tu tiempo para explicarme, de los dos ejemplos que meciones tomare el primero ya que siempre es mejor hacer las cosas con forme al deber ser y no en base a la comodidad que nos proporcionan ciertas practicas, lo desmenuzare, analizare pero sobre todo practicare con el...ya que para mi forma de ver las cosas no existe mejor maestro que la practica.

    Saludos y muchas gracias de nuevo.


    Luis Escobar


  • martes, 05 de junio de 2012 6:26
     
     

    Hola Luis.

    Si, solo la practica te da la experiencia, siempre he pensado que la mejor forma de coger experiencia es ver codigo y escribir codigo, pero sobre todo tener en mente la ley que mas me gusta "ley del instrumento" tambien conocida como "Ley del martillo de oro".

    Si encuentras algun problema o duda comentalo.


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


  • martes, 05 de junio de 2012 21:48
     
     

    Hola David, he de confesar que jamas habia escuchado la Ley del Martillo de Oro:

    Dejo lo que encontre de esa ley en la web por si a alguien mas le desperto la curiosidad.

    Significado metafórico de la frase de Abraham Maslow: "Es muy tentador, si sólo tienes un martillo, tratar a todo como si fuera clavo." En el problem solving, la regla opuesta es la que debería aplicarse. Es decir, usar la herramienta adecuada para la tarea actual.

    Saludos y gracias por ese aporte cultural!


    Luis Escobar Foro VB.NET 1062 "Sin Respuesta" 13097 Respondida ¡Ayuda al Foro a reflejar información exacta marcando las respuestas cuando logren satisfacer tus necesidades!