C # ¿Cómo copio el valor de una fila seleccionada de datagridview de un formulario a una fila de datagridview en otro formulario?

c# datagridview html-agility-pack winforms

Pregunta

Estoy usando el paquete de agilidad html para obtener los datos para la vista de cuadrícula. Simplemente quiero copiar una fila usando un botón de columna para enviarla a una vista de cuadrícula en blanco en otro formulario. No hay enlaces de datos o SQL. Después de rellenar la cuadrícula, obtengo la vista completa de la cuadrícula de datos sin presionar el botón de columna. El código que tengo es:

Formulario 1

private void LeadsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    Database DB = new Database(LeadsDataGridView.DataSource);

    var senderGrid = (DataGridView)sender;

    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
    {
        DB.Row = LeadsDataGridView.CurrentRow;
    }

    Search_Table.AcceptChanges();

    LeadsDataGridView.DataSource = Search_Table;
}

Formulario 2

public Database(object DataSource)
{
    InitializeComponent();
    InitDBTable();
    DB_GridView.DataSource = DataSource;
}

Respuesta aceptada

Aquí hay un ejemplo mínimo que, con suerte, lo pondrá en camino.

MainWindow.xaml

<Window x:Class="PassingValuesFromFormToForm_45425412.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PassingValuesFromFormToForm_45425412"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="61,60,0,0" VerticalAlignment="Top" Width="259"/>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="29,13,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
    </Grid>
</Window>

MainWindow.xaml.cs

using System.Collections.Generic;
using System.Windows;

namespace PassingValuesFromFormToForm_45425412
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        List<dgvEntry> dgvList = new List<dgvEntry>();
        public MainWindow()
        {
            InitializeComponent();
            dgvList.Add(new PassingValuesFromFormToForm_45425412.dgvEntry { col1 = "blah blah", col2 = "blehbleh" });
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = dgvList;
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            Window1 win1 = new Window1((dgvEntry)dataGrid.Items[0]);
            win1.Show();
        }
    }

    public class dgvEntry {
        public string col1 { get; set; }
        public string col2 { get; set; }
    }
}

Window1.xaml

<Window x:Class="PassingValuesFromFormToForm_45425412.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PassingValuesFromFormToForm_45425412"
        mc:Ignorable="d"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="23,39,0,0" VerticalAlignment="Top" Width="181"/>

    </Grid>
</Window>

Window1.xaml.cs

using System.Collections.Generic;
using System.Windows;

namespace PassingValuesFromFormToForm_45425412
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        public Window1(dgvEntry incomingItem)
        {
            InitializeComponent();
            dataGrid.AutoGenerateColumns = true;
            dataGrid.ItemsSource = new List<dgvEntry> { incomingItem };
        }
    }
}

Aquí hay una actualización para WinForms. De nuevo, este es un ejemplo mínimo. Para el propósito de esta muestra, no hice nada en el diseñador de formularios. Todo se hace a través del código detrás.

Form1.cs

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {

        DataGridView dgv = new DataGridView();
        BindingList<dgvitem> itemsList = new BindingList<dgvitem>();
        bool SendAsRow = true;//just a variable to trigger the proper method in 'Dgv_CellContentClick'
        Button independantButton = new Button();

        public Form1()
        {
            InitializeComponent();
            InitializeTheDGV();
            AddTheButton();
            itemsList.Add(new dgvitem { JustaTextField = "aksldjf sadfjasifuqw adsfasf" });
            itemsList.Add(new dgvitem { JustaTextField = "qwerioqu aisdfnvmz, oaa"});
        }

        private void InitializeTheDGV()
        {
            dgv.Location = new Point(this.Location.X + 5, this.Location.Y + 5);
            dgv.DataSource = itemsList;
            dgv.AutoGenerateColumns = false;
            this.Controls.Add(dgv);
            dgv.Columns.Add(new DataGridViewTextBoxColumn() { HeaderText = "My col header", Name="mycol1" });
            dgv.Columns.Add(new DataGridViewButtonColumn() { HeaderText = "click in this column", Name = "mycol2" });
            dgv.Columns["mycol1"].DataPropertyName = "JustaTextField";
            dgv.CellContentClick += Dgv_CellContentClick;
        }

        private void Dgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (!(sender is DataGridView))
            {
                return;
            }

            /*
             * Experiment and Pick your poison
             */
            if (SendAsRow)
            {
                Form2 f2r = new Form2(dgv.Rows[e.RowIndex]);
                f2r.Show();
            }
            else
            {
                Form2 f2 = new Form2((string)dgv.Rows[e.RowIndex].Cells[0].FormattedValue);
                f2.Show();
            }
            /**/
        }


        private void AddTheButton()
        {
            independantButton.Location = new Point(this.Location.X + 5, this.Location.Y + dgv2.Height + 15);
            independantButton.Click += IndependantButton_Click;
            this.Controls.Add(independantButton);
        }

        private void IndependantButton_Click(object sender, System.EventArgs e)
        {
            /*
             * Experiment and Pick your poison
             */
            if (SendAsRow)
            {
                Form2 f2r = new Form2(dgv.SelectedRows[0]);
                f2r.Show();
            }
            else
            {
                Form2 f2 = new Form2((string)dgv.SelectedRows[0].Cells[0].FormattedValue);
                f2.Show();
            }
            /**/

        }
    }


    public class dgvitem
    {
        public string JustaTextField { get; set; }
    }
}

Form2.cs

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form2 : Form
    {
        DataGridView dgv2 = new DataGridView();
        BindingList<dgv2item> dgv2list = new BindingList<dgv2item>();

        //this is the 'default' constructor which takes no argument
        public Form2()
        {
            InitializeComponent();
            MakeTheGrid();
        }

        //this form constructor takes a String parameter so you can pass only a string
        public Form2(string incomingText)
        {
            InitializeComponent();
            MakeTheGrid();
            dgv2list.Add(new dgv2item { coolBeans = incomingText });//add the incoming String to the itemList, which will in-turn update the DataGridView
        }


        //this form constructor takes a DataGridViewRow parameter so you can pass the whole row
        public Form2(DataGridViewRow incomingRow)
        {
            InitializeComponent();
            MakeTheGrid();
            dgv2list.Add(new dgv2item { coolBeans = (string)incomingRow.Cells[0].FormattedValue});//add the value of the cell you want out of the row to the itemlist, which will in-turn update the DataGridView
        }


        private void MakeTheGrid()
        {
            dgv2.Location = new Point(this.Location.X + 15, this.Location.Y + 15);//it has to go somewhere...
            dgv2.AutoGenerateColumns = true;
            dgv2.DataSource = dgv2list;//define where to find the data
            this.Controls.Add(dgv2);//add it to the form
        }
    }


    public class dgv2item
    {
        public string coolBeans { get; set; }
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué