【问题标题】:Separating data adapter and gridview into a class file将数据适配器和网格视图分离到一个类文件中
【发布时间】:2025-12-19 04:00:15
【问题描述】:

我正在尝试将我的代码分成类文件。但是我遇到的问题是如何从类文件中访问包含在Form1 中的dataGridviewLogging

public void getLogging(String sql)
{
    SqlDataAdapter dataadapter = new SqlDataAdapter(sql, mycon);       
    DataSet ds = new DataSet();

    try
    {
        dataadapter.Fill(ds, "LOG_MESSAGE");
        dataGridViewLogging.DataSource = ds;
        dataGridViewLogging.DataMember = "LOG_MESSAGE";
    }
    catch (Exception f)
    {
        Console.WriteLine(f.ToString());
        MessageBox.Show("FAILURE:" + f.ToString());
        return;
    }
}

我一直在想办法做到这一点?想法?

【问题讨论】:

  • 你不应该这样做。您的类应该包含与页面布局无关的实体和抽象数据类型。

标签: c# datagridview dataadapter


【解决方案1】:

你可以做一些类似层架构的事情...表示、业务逻辑和数据访问。

创建一个以字符串为命令文本的方法或函数,指定你的命令类型(SP或内联命令)

使用它来获取 DataSet 或 DataTable 作为返回对象。

Public DataTable GetDataTableFromDB(String CommandText,
                                    SqlCommandType type,
                                    SqlParameter [] param)
{
    DataTable temp=somthing;
    /* your logic */
    return DataTable;
}

将此用作类文件并在您的 form1 类或 form1.cs 中获取您的数据集(如果您是 c# 蜜蜂)

玩得开心,毕竟代码很有趣!

【讨论】:

    【解决方案2】:

    由于您的方法名为getLogging,您希望返回可用作数据源的数据。因此,与其在此处设置数据源,不如将其设置在可以访问数据绑定控件的位置。

    例如(在Form1中):

    dataGridViewLogging.DataSource = getLogging(
              DateTime.Today.AddMonths(-6)
            , DateTime.Today);  // don't pass the sql directly, use parameters instead
    

    在你的班级里:

    public DataSet getLogging(DateTime logFrom, DateTime logTo)
    {
        DataSet ds = new DataSet();
        const string sql = "SELECT Columns FROM dbo.Table WHERE LoggedAt BETWEEN @LoggedFrom AND @LoggedTo ... ODRER BY ...";
        using (var mycon = new SqlConnection(connectionString))
        using (var da = new SqlDataAdapter(sql, mycon))
        {
            da.SelectCommand.Parameters.AddWithValue("@LoggedFrom", logFrom);
            da.SelectCommand.Parameters.AddWithValue("@LoggedTo", logFrom);
            try
            {
                da.Fill(ds);
            } catch (Exception f)
            {
                // log here
                throw;
            }
        }
        return ds;
    }
    

    【讨论】:

    • 该类不返回数据集。 return 语句在哪里?
    • @user1158745:当然,相应地编辑了我的答案。顺便说一句,如果您想使用自定义参数过滤哪些值可以作为参数添加到此方法,请使用SqlParameters。这就是我将 sql 字符串设为常量的原因。参数也会阻止sql注入。
    • @user1158745:编辑了我的答案以显示您将如何使用参数。
    • 对不起,我没有关注:在课堂上,我们正在返回数据集。现在如何在我的表单中使用它?
    • 好吧,我认为这不是我想要的。我只是想分离我的代码,但数据集并不允许你这样做。
    最近更新 更多