我正在尝试通过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
}
}
}
答案 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后面的代码并将其修改为私有。 欢呼声。