Form 2 Button无法访问Form1 GridView

时间:2016-03-25 08:32:49

标签: c# winforms gridview datagridview

我正在尝试通过Form2中的按钮与位于Form1(frPlanDeLucru)中的DataGridView进行交互。这样做的原因是创建一个单独的搜索窗口。我一直得到错误CS0122,frPlanDeLucru.dataGridView1'由于其保护级别而无法访问。

请帮忙。

表格1中的守则:

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.OleDb;

namespace Plan_de_lucru
{
    [Serializable()]
    public partial class frPlanDeLucru : Form
    {
        public frPlanDeLucru()
        {
            InitializeComponent();
        }

        public void TextBox1_TextChanged(object sender, EventArgs e)
        {

        }

        public void ctrlLoad_Click(object sender, EventArgs e)
        {

            string constr = "Provider = MicroSoft.Jet.OLEDB.4.0; Data Source=" + TextBox1.Text + "; Extended Properties =\"Excel 8.0; HDR=Yes;\";";
            OleDbConnection con = new OleDbConnection(constr);
            OleDbDataAdapter sda = new OleDbDataAdapter("Select * From [" + textBox2.Text + "$]", con);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            dataGridView1.DataSource = dt;
            new Form2().Show();
            this.Show();
        }



            }
        }

Form2中的代码:

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 Plan_de_lucru
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public void search_button_Click(object sender, EventArgs e)
        {
            String str = "select * from searchBox where ( Name like '%' + @search + '%')";
            BindingSource bs = new BindingSource();
            bs.DataSource = frPlanDeLucru.dataGridView1.DataSource; //<- Here is the problem, do not know the fix



        }
    }
}

3 个答案:

答案 0 :(得分:1)

在Form2中:

public DataGridView Dgv { get; set; }

在Form1中:

Form2 f = new Form2();
f.Dgv = dt; //Add this to the ctrlLoad_Click

在Form2中访问自己的Dgv。

答案 1 :(得分:0)

您可以在创建表单b时添加引用以形成a,并在返回您希望的数据源的“formA”中公开公共方法/属性。使用它的一个例子:

public class FormA
{
   public FormA()
   {
   }

   public object GetDataSource()
   {
      return datagrid1.DataSource.ToObject();
   }
}

public class B
{
    private A _formA;

    public B(A formA)
    {
       _formA = formA;
    }

    private void GetDataSourceFromA()
    {
        object dataSource = _formA.GetDataSource();
    }
}

这可能会导致另一个问题;第二种形式在不同的线程上。不能从第一个表单调用另一个线程上的对象more info here,尽管我认为超出了您的问题的范围。

答案 2 :(得分:0)

感谢您的帮助。我发现Form1 GridView设置为私有...我输入Form1后面的代码并将其修改为私有。 欢呼声。