【问题标题】:pass checked datagridview rows from child form to main form datagridview将检查的 datagridview 行从子窗体传递到主窗体 datagridview
【发布时间】:2017-09-01 10:06:42
【问题描述】:

我有 2 个表格

  • ApodeikseisTimologion
  • EggrafesTimologionEsodon

ApodeikseisTimologion 是主窗体,EggrafesTimologionEsodon 是子窗体,每个窗体中有 1 个数据网格视图(dataGridViewProionApodeixeisTimologiouEsodondataGridViewEggrafesProionParastikouEsodon)。

DataGridViewProionApodeixeisTimologiouEsodon 属于主窗体,dataGridViewEggrafesProionParastikouEsodon 属于子窗体。 现在,我想将检查的值从子表单传递到父表单,而不会丢失我已经在父表单的其他文本框中放入的值。 这是我的代码:

形成 ApodeikseisTimologion。 我用它来打开子窗体

private void LinkLblEisagogiEggrafon_Click(object sender, EventArgs e) {
    EggrafesTimologionEsodon eggrTimolEsodon = new EggrafesTimologionEsodon(cmbBoxEponimiaPelatiApodeixeisTimologiouEsodon.Text);
    eggrTimolEsodon.ShowDialog();
    this.Refresh();
}

形成 EggrafesTimologionEsodon

private void EggrafesTimologionEsodon_Load(object sender, EventArgs e) {
    try {

        con = new SqlConnection();
        con = DBAccess.Conn;
        con.Open();

        adap = new SqlDataAdapter("select ProionParastatikou.* from ProionParastatikou inner join Parastatiko on ProionParastatikou.ParastatikoID = Parastatiko.ParastatikoID" +
                                      " where ProionParastatikou.Ypoloipo > 0.00  and Parastatiko.Eponimia = '" + txtPelatisId.Text + "'", con);
        ds = new System.Data.DataSet();
        adap.Fill(ds, "BsProionParastatikouEsodon");
        dataGridViewEggrafesProionParastikouEsodon.DataSource = ds.Tables[0];
        con.Close();
    }

    catch (Exception ex) {
        MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    finally {
        if (MyConn.State != ConnectionState.Closed)
            MyConn.Close();
        }
    }

我有这张图片:

在子表单中,我还可以检查 datagridview 复选框列中的行并将它们存储到列表中,以便将它们传输到父表单,而不会丢失我已经拥有的其他数据。

private void BtnProsthikiEggrafon_Click(object sender, EventArgs e) {
    ApodeixeisTimologion apo = new ApodeixeisTimologion(null);
    List<Int64> lst2send = new List<Int64>();
    Int64 toSend;

    foreach (DataGridViewRow eggrafes in dataGridViewEggrafesProionParastikouEsodon.Rows) {
        if (Convert.ToBoolean(eggrafes.Cells["CheckBoxColumn"].Value)) {
            int RowIndexCheck = eggrafes.HeaderCell.RowIndex;             
                 Int64.TryParse(dataGridViewEggrafesProionParastikouEsodon.Rows[RowIndexCheck].Cells["proionParastatikouIDDataGridViewTextBoxColumn"].Value.ToString(),out toSend);
                lst2send.Add(toSend);
            }
        }

        apo.AfterProsthikiProionParastatikou(null, null, lst2send);
        //apo.Refresh();
        this.Close();
    }

当子窗体关闭时,我在父窗体中有它:

public void AfterProsthikiProionParastatikou(object sender,EventArgs e,IList<Int64> lst) {
    String csvLst = string.Empty;
    int count = 0;

    foreach ( Int64 lstItems in lst) {
        if (count == 0) {
            csvLst = lstItems.ToString();
            count += 1;
        }
        else {
            csvLst = csvLst + "," + lstItems.ToString();
        }
    }

     _con = new SqlConnection();
     _con = DBAccess.Conn;
     _con.Open();

     adap = new SqlDataAdapter("select ProionParastatikou.* from ProionParastatikou where" +
            " ProionParastatikou.Ypoloipo > 0.00  and ProionParastatikou.ProionParastatikouID"+
            " in( " + csvLst + ")", _con);

     ds = new System.Data.DataSet();
     adap.Fill(ds, "bsProionApodeixeisTimologiouEsodon");//
     dataGridViewProionApodeixeisTimologiouEsodon.DataSource = ds.Tables["bsProionApodeixeisTimologiouEsodon"];
     //dataGridViewProionApodeixeisTimologiouEsodon.Refresh();
     _con.Close();

 }

我在

中做了一个断点
ds = new System.Data.DataSet();
adap.Fill(ds, "bsProionApodeixeisTimologiouEsodon");//
dataGridViewProionApodeixeisTimologiouEsodon.DataSource = ds.Tables["bsProionApodeixeisTimologiouEsodon"];

我看到 ds 填充了正确的值,但行没有出现在 dataGridViewProionApodeixeisTimologiouEsodon 中,它是父表单中的网格。

在所有表单中,我在数据网格中使用数据集和 bindingSources,并且数据网格是有界的,除了复选框列。 有人可以帮忙吗。 如果有人需要更多帮助,我会提供。

【问题讨论】:

  • 感谢编辑...您能帮忙吗?
  • 对不起,我不明白问题是什么......也许你能试着更好地解释这里的问题是什么?
  • 问题是我无法在主窗体中传输它们
  • 您的意思是您在子表单中的网格中的数据没有被传输到主表单中吗?
  • 你是对的......

标签: c# vb.net forms winforms datagridview


【解决方案1】:

这是一个最小但有效的示例。 在 Form2 上有一个公共属性,并从 Form1 访问它。我的 sn-p 正在传递一个字符串,但您的将处理不同的数据类型。相同的概念,不同的数据类型。

Form1.cs

using System;
using System.Windows.Forms;

namespace PassParamsFromForm2ToForm1_45997869
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += Button1_Click;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2("blah blah blah");
            f2.ShowDialog();
            label1.Text = f2.returnValue;
        }
    }
}

Form2.cs

using System;
using System.Windows.Forms;

namespace PassParamsFromForm2ToForm1_45997869
{
    public partial class Form2 : Form
    {
        public string returnValue;
        private string submittedString { get; set; }
        public Form2(string incomingString)
        {
            InitializeComponent();
            submittedString = incomingString;
            button1.Click += Button1_Click;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            returnValue = "I'd rather show you my value instead of yours(" + submittedString + ")...";
            this.Close();
        }
    }
}

使用网格类型

Form1.cs

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

namespace PassParamsFromForm2ToForm1_45997869
{
    public partial class Form1 : Form
    {
        BindingList<gridentry> gridList = new BindingList<gridentry>();
        DataGridView dgv = new DataGridView();
        DataGridView gridViewForTheReturnedRows;
        public Form1()
        {
            InitializeComponent();
            initializeGrid();
            addDataToGridSource("name1");
            addDataToGridSource("name2");
            addDataToGridSource("name3");
            addDataToGridSource("name4");
            button1.Click += Button1_Click;
        }

        private void addDataToGridSource(string incomingString)
        {
            gridList.Add(new gridentry { col1 = incomingString, col2 = incomingString + "in col2", col3 = incomingString + "in col3" });
        }

        private void initializeGrid()
        {
            dgv.Location = new System.Drawing.Point(this.Location.X + 5, this.Location.Y + 5);
            this.Controls.Add(dgv);
            dgv.AutoGenerateColumns = true;
            dgv.DataSource = gridList;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(dgv);
            f2.ShowDialog();

            if (f2.returnRows != null && f2.returnRows.Count > 0)
            {
                gridViewForTheReturnedRows = new DataGridView();
                gridViewForTheReturnedRows.ColumnCount = f2.returnRows[0].Cells.Count;
                gridViewForTheReturnedRows.Rows.InsertRange(0, f2.returnRows.ToArray());

                gridViewForTheReturnedRows.Location = new System.Drawing.Point(10, dgv.Location.Y + dgv.Height + 5);
                this.Controls.Add(gridViewForTheReturnedRows);
            }
        }
    }

    public class gridentry
    {
        public string col1 { get; set; }
        public string col2 { get; set; }
        public string col3 { get; set; }
    }
}

Form2.cs

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

namespace PassParamsFromForm2ToForm1_45997869
{
    public partial class Form2 : Form
    {
        public DataGridView returnGrid = new DataGridView();
        public List<DataGridViewRow> returnRows { get; set; }
        private DataGridView submittedGrid { get; set; }


        public Form2(DataGridView incomingGrid)
        {
            InitializeComponent();
            submittedGrid = incomingGrid;
            submittedGrid.Location = new System.Drawing.Point(this.Location.X + 5, this.Location.Y + 5);
            Controls.Add(submittedGrid);
            button1.Click += Button1_Click;
        }


        private void Button1_Click(object sender, EventArgs e)
        {
            returnGrid = submittedGrid;//if you want to return the grid

            //returning rows
            /*
             * You'll need your own mechanism to differentiate between 
             */
            bool rowIsModified = false;
            returnRows = new List<DataGridViewRow>();
            foreach (DataGridViewRow item in submittedGrid.Rows)
            {
                if (item.Index % 2 != 0)
                {
                    rowIsModified = true;
                }
                if (rowIsModified)
                {
                    DataGridViewRow r = (DataGridViewRow)item.Clone();
                    for (int i = 0; i < item.Cells.Count; i++)
                    {
                        r.Cells[i].Value = item.Cells[i].Value;
                    }
                    returnRows.Add(r);
                }
            }
            this.Close();
        }
    }
}

【讨论】:

  • 我不知道它有什么帮助...我想将 ckecked 行从子窗体传输回主窗体。如果你愿意,你可以看到我拥有的图像。
  • sn-p 显示如何将数据从 form2 传输到 form1。如果您想知道如何区分修改后的行和未修改的行以便只能传输修改后的行,也许您应该重新表述您的问题。
  • 我认为你只是在传输一个文本,对吧?
  • 如何传输datagridview?
  • 是的,但如上所述...您传递的类型完全取决于您。我传递了一个string,因为我用来返回值的属性被声明为public string returnValue;。如果在Form2 中,我声明了public DataGridView returnValue;,那么我本来可以做到returnValue = dataGrid2OnForm2
【解决方案2】:

形成 ApodeikseisTimologion。我用它来打开子窗体

private void LinkLblEisagogiEggrafon_Click(object sender, EventArgs e)
        {
            if (cmbBoxEponimiaPelatiApodeixeisTimologiouEsodon.Text == "")
            {
                MessageBox.Show("Πρέπει να επιλέξετε Πελάτη", "Προειδοποίηση");
            }
            else
            {

                EggrafesTimologionEsodon eggrTimolEsodon = new EggrafesTimologionEsodon(cmbBoxEponimiaPelatiApodeixeisTimologiouEsodon.Text);//p

                eggrTimolEsodon.ShowDialog();

                listToFill = eggrTimolEsodon.lst2send;

                AfterProsthikiProionParastatikou(null,null,listToFill);

                //AfterProsthikiProionParastatikou(null);
                //this.Refresh();

            }


        }

形成 EggrafesTimologionEsodon

private void EggrafesTimologionEsodon_Load(object sender, EventArgs e)
        {

            //CmbBoxPelatis.SelectedIndex = -1;

            //EggrafesTimologionEsodon values = new EggrafesTimologionEsodon();
            try
            {

                con = new SqlConnection();
            con = DBAccess.Conn;
            con.Open();

            adap = new SqlDataAdapter("select ProionParastatikou.* from ProionParastatikou inner join Parastatiko on ProionParastatikou.ParastatikoID = Parastatiko.ParastatikoID" +
                                      " where ProionParastatikou.Ypoloipo > 0.00  and Parastatiko.Eponimia = '" + txtPelatisId.Text + "'", con);
            ds = new System.Data.DataSet();
            adap.Fill(ds, "BsProionParastatikouEsodon");
            dataGridViewEggrafesProionParastikouEsodon.DataSource = ds.Tables[0];

            con.Close();
            }

            catch (Exception ex)
            {
                MessageBox.Show("Error\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            finally
            {
                if (MyConn.State != ConnectionState.Closed)
                    MyConn.Close();
            }
        }

从中我得到了位于顶部的图像。

public List<Int64> lst2send;

        private void BtnProsthikiEggrafon_Click(object sender, EventArgs e)
        {
            lst2send = new List<Int64>();
            Int64 toSend;
            foreach (DataGridViewRow eggrafes in dataGridViewEggrafesProionParastikouEsodon.Rows)
            {
                if (Convert.ToBoolean(eggrafes.Cells["CheckBoxColumn"].Value))
                {
                    int RowIndexCheck = eggrafes.HeaderCell.RowIndex;             
                    Int64.TryParse(dataGridViewEggrafesProionParastikouEsodon.Rows[RowIndexCheck].Cells["proionParastatikouIDDataGridViewTextBoxColumn"].Value.ToString(),out toSend);
                    lst2send.Add(toSend);
                }

            }
            this.Close();

        }

当子窗体关闭时,我在父窗体中有它:

public List<Int64> listToFill;

        public void AfterProsthikiProionParastatikou(object sender, EventArgs e, IList<Int64> lst)//object sender,EventArgs e,
        {
            String csvLst = string.Empty;
            int count = 0;
            foreach ( Int64 lstItems in lst)
            {
                if (count == 0)
                {
                    csvLst = lstItems.ToString();
                    count += 1;
                }
                else
                {
                    csvLst = csvLst + "," + lstItems.ToString();
                }

            }
            _con = new SqlConnection();
            _con = DBAccess.Conn;
            _con.Open();


            adap = new SqlDataAdapter("select ProionParastatikou.* from ProionParastatikou where" +
                                                     " ProionParastatikou.Ypoloipo > 0.00  and ProionParastatikou.ProionParastatikouID"+
                                                     " in( " + csvLst + ")", _con);

            DataSetApodeixeisTimologiouEsodon ds = new DataSetApodeixeisTimologiouEsodon();

            adap.Fill(ds.ApodeixeisProionParastatiko);//

            bsProionApodeixeisTimologiouEsodon.DataSource = ds.ApodeixeisProionParastatiko;// Tables[0];
            dataGridViewProionApodeixeisTimologiouEsodon.DataSource = bsProionApodeixeisTimologiouEsodon;

            _con.Close();

        }


private void LinkLblEisagogiEggrafon_Click(object sender, EventArgs e)
        {
            if (cmbBoxEponimiaPelatiApodeixeisTimologiouEsodon.Text == "")
            {
                MessageBox.Show("Πρέπει να επιλέξετε Πελάτη", "Προειδοποίηση");
            }
            else
            {

                EggrafesTimologionEsodon eggrTimolEsodon = new EggrafesTimologionEsodon(cmbBoxEponimiaPelatiApodeixeisTimologiouEsodon.Text);//p

                eggrTimolEsodon.ShowDialog();

                listToFill = eggrTimolEsodon.lst2send;

                AfterProsthikiProionParastatikou(null,null,listToFill);

                //AfterProsthikiProionParastatikou(null);
                //this.Refresh();

            }


        }

我得到了我想要的结果 enter image description here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多