从其他类访问表单类

本文关键字:表单 访问表 访问 其他 | 更新日期: 2023-09-27 18:14:27

我已经为此挣扎了一天多了。似乎很多人都问过类似的问题,但他们通常想做一些比我需要的更先进的事情。我有一个想法,它应该是什么样子(我认为),但实际上正确实现它的斗争-所以它是这样的:

我有一个表单应用程序,做一些Odbc, Sql, Csv导入/导出。

我的主要类是ImportForm类,它包含所有的按钮,控件,它还在每个构造函数中创建SQL和ODBC连接等。

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        ImportForm importForm = new ImportForm();
        Application.Run(importForm);
    }

.

    public partial class ImportForm : Form
    public static SqlConnection sqlConnection = new SqlConnection(ConstantValues.SqlConnectionString);
    public static OdbcConnection odbcConnection = new OdbcConnection(ConstantValues.OdbcConnectionString);
    (...)

我现在有几个其他类做不同的事情。例如,有一次将CSV文件导入SQL Server。它通过SqlBulk基于ImportForm类中定义的SQL连接来完成:

internal class CsvImportIntoSql
    SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConnection);

然而,这会返回一个语法错误'该名称不存在于当前上下文中'

我试着:

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(importForm.sqlConnection);

但是它不起作用,类ImportForm在上下文中可用,但其定义的实例ImportForm不是,我无法理解为什么和我应该做些什么来使它工作-我一直在与之斗争一段时间,不得不采用不同的解决方法,这通常不会使好的代码。

从其他类访问表单类

几乎正确:您需要类名ImportForm,而不是它的实例(ImportForm)来访问静态属性:

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(ImportForm.sqlConnection);

如果CsvImportIntoSql实例是在ImportForm中创建的,那么您最好的选择是注入sqlConnection,或者如果在CsvImportIntoSql实例创建后可能发生变化,则注入对CsvImportIntoSql实例本身的引用。

如果我理解的话,您正在尝试使用在另一个类中定义的相同sqlConnection变量。但是,您似乎已将此变量声明为静态,这应该有助于从另一个类引用它:

尝试替换

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConnection);

:

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(ImportForm.sqlConnection);

这应该可以工作。但是,在多个实例中使用相同的连接并不总是一个好的做法。相反,可以为每个作业初始化一个新连接。