Vamos a enviar una fila de datos de un formulario a otro formulario, además de validar para que no se pueda enviar el mismo dato dos veces si este ya se encuentra en el segundo formulario.
Base de datos y procedimiento almacenado
Primero creamos nuestra base de datos BDtest, una simple tabla clientes y un procedimiento para listar los clientes.
create database BDtest go use BDtest go create table clientes ( codigo varchar(5), nombre varchar(50), cargo varchar(50) ); insert into clientes values ('A0001','Alfreds Futterkistexd','Representante de ventas'); insert into clientes values ('A0002','Ana Trujillo Emparedados y helados','Propietario'); insert into clientes values ('A0003','Antonio Moreno Taquería','Propietario'); insert into clientes values ('A0004','Paul Christian Arturo','Representante de ventas'); go create proc sp_listar_clientes as select * from clientes go exec sp_listar_clientes
Formulario 1 - recibe y puede eliminar los datos
Creamos una interfaz VarDatosEntreForm que permitirá la comunicación entre los dos formularios. la variable n almacenará el índex de la fila seleccionada, el botón 1 abrirá el otro formulario, el proceso que hace TablaDeAgregarDatos primero la fila que se esta recibiendo tiene el código del cliente ese código se almacena en valoritem luego recorre el DataGridView exactamente en la columna de códigos buscando coincidencia, si ya existe saldrá un mensaje caso contrario agregará la fila.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form,VarDatosEntreForm { int n; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 formulario2 = new Form2(); formulario2.ShowDialog(this); } public void TablaDeAgregarDatos(DataGridViewRow fila1a) { bool DatoSeEncuentraEnLaLista = false; String valoritem = fila1a.Cells["codigo"].Value.ToString(); foreach (DataGridViewRow fila1b in dgvform1.Rows) { if (fila1b.Cells[0].Value.ToString().Equals(valoritem)) { MessageBox.Show("Este dato ya se encuentra en la lista."); DatoSeEncuentraEnLaLista = true; break; } } if (DatoSeEncuentraEnLaLista != true) { String cod = fila1a.Cells["codigo"].Value.ToString(); String nom = fila1a.Cells["nombre"].Value.ToString(); String car = fila1a.Cells["cargo"].Value.ToString(); this.dgvform1.Rows.Add(new[] { cod, nom, car }); } } private void dgvform1_CellContentClick(object sender, DataGridViewCellEventArgs e) { n = e.RowIndex; } private void button2_Click(object sender, EventArgs e) { dgvform1.Rows.RemoveAt(n); } private void button3_Click(object sender, EventArgs e) { dgvform1.Rows.Clear(); } } internal interface VarDatosEntreForm { void TablaDeAgregarDatos(DataGridViewRow fila1a); } }
Formulario 2 - lista y envía los datos
A diferencia del otro formulario este solo se encarga de realizar la conexión, listar los clientes y enviar la fila seleccionada por medio de la interfaz VarDatosEntreForm .
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using System.Configuration; namespace WindowsFormsApp1 { public partial class Form2 : Form { SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["sql"].ConnectionString); public Form2() { InitializeComponent(); } public DataTable Listar_clientes() { SqlCommand cmd = new SqlCommand("sp_listar_clientes",cn); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); return dt; } private void Form2_Load(object sender, EventArgs e) { dgvform2.DataSource = Listar_clientes(); } private void button1_Click(object sender, EventArgs e) { VarDatosEntreForm var1 = Owner as VarDatosEntreForm; DataGridViewRow fila = dgvform2.SelectedRows[0] as DataGridViewRow; var1.TablaDeAgregarDatos(fila); this.Close(); } } }
App config
Asegúrate de modificar el nombre del servidor.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <connectionStrings> <add name="sql" connectionString="server=localhost\SQLEXPRESS;integrated security=true;database=BDtest"/> </connectionStrings> </configuration>
Recuerda 👀
Solo se puede enviar una fila a la vez.
Además de que toda la fila debe estar seleccionada SelectionMode = FullRowSelect.