您好,以下是我的代码,定义了一个公共方法的getdataset和getdatatable,想实现一运行,combobox1下拉控件就会出现数据表的设备名列表,但运行时combobox1控件总提示,
无法通过嵌套类型“生产数据提取开发.Form1.SqlCon”来访问外部类型“生产数据提取开发.Form1”的非静态成员;
代码如下,请专家给指点一下吧,多谢
public DataTable getDataTable(string SQLstr, string b_EquipmentInfo)
{
DataTable dt = new DataTable();
getcon();//打开数据库连接
SqlDataAdapter SQLda = new SqlDataAdapter(SQLstr, My_con);
DataSet ds = new DataSet();
SQLda.Fill(ds, "b_EquipmentInfo");
dt = ds.Tables["b_EquipmentInfo"];
con_close();//关闭数据库连接
return dt;//返回DataSet对象信息
}
static void main(string[] args)
{
getcon();
try
{ //打开链接
My_con.Open();
My_con = new SqlConnection(Str_sqlcon1);
MessageBox.Show("连接数据库成功");
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM b_EquipmentInfo,conn");
//用DataAdapter声明一个对象
SqlDataAdapter sda = new SqlDataAdapter();
//执行查询语句
sda.SelectCommand = sqlcmd;
//创建一个数据集对象
DataSet ds = new DataSet();
}
catch (Exception ex)
{
MessageBox.Show("连接数据库失败");
return;
}
finally
{
if (My_con != null)
{
//关闭数据库连接
My_con.Close();
}
}
}
private void ComboBoxForm_Load(object sender, EventArgs e)
{
SqlCon A = new SqlCon();
A.getDataSet("ds","数据集");
A.getDataTable("dt", "数据表");
// 绑定combobox的数据集
comboBox1.DataSource = A.getDataSet("ds", "数据集");
//选定combobox显示的成员及将Name这一列显示在combobox中
comboBox1.DisplayMember = "Equipmentname";
//combobox的实际取值
comboBox1.ValueMember = "Equipmentcode";
}
这个错误是由于在类SqlCon中定义的方法getDataSet和getDataTable是非静态的,而在main函数中直接使用了SqlCon类的对象,导致无法访问非静态方法。
解决办法是在main函数中使用SqlCon类的实例对象来调用非静态方法。
例如:
SqlCon A = new SqlCon();
A.getDataSet("ds","数据集");
A.getDataTable("dt", "数据表");
或者在getDataSet和getDataTable方法上加上static关键字,使其变为静态方法。
另外还有一个问题就是在ComboBoxForm_Load事件中
comboBox1.DataSource = A.getDataSet("ds", "数据集");
A.getDataSet("ds", "数据集")返回的是一个DataSet类型的对象,而不是DataTable类型的对象,而DataTable类型的对象才能绑定到ComboBox控件的DataSource属性上。
所以需要修改一下,可以将getDataSet方法改为返回DataTable类型的对象,并且将绑定的方式改为:
comboBox1.DataSource = A.getDataTable("dt", "数据表");
最后需要注意一下是在ComboBoxForm_Load事件中绑定数据源,还需要在main函数中先连接数据库,然后在ComboBoxForm_Load事件中才能绑定数据源。