【问题标题】:C# DatagridView fill with class SingleResponsibilityC# DatagridView 填充类 SingleResponsibility
【发布时间】:2020-09-14 09:38:12
【问题描述】:

您好 StackOverflow 成员,我决定构建一个库项目来提高自己。 我创建了一个类来编写书籍操作,但我不知道如何通过类方法填充数据网格。 当我将此方法发送到按钮操作时,它不起作用。我找到了实现它的解决方案。这是我的 BookOperation 类中的一些代码;

public void GetBookByName(Yönetici f1)
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("Select * from Kitaplar where Kitap_Adi like '%" + f1.textBox1.Text.Trim() + "%'", conn); 
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        f1.dataGridView1.DataSource = dt;
        conn.Close();
    }
    public void GetBookByAuthor(Yönetici f1)
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("Select * from kitaplar where Yazar like '%" + f1.textBox1.Text.Trim() + "%'", conn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        f1.dataGridView1.DataSource = dt;
        conn.Close();

    }
    public void GetBookByGenre(Yönetici f1)
    {
        conn.Open();
        SqlCommand cmd = new SqlCommand("Select * from kitaplar where Tür like '%" + f1.textBox1.Text.Trim() + "%'", conn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);
        f1.dataGridView1.DataSource = dt;
        conn.Close();
    }

Yönetici 是我的图书操作应用程序屏幕的名称。 在按钮动作中,它包括;

Kitap_islemleri ki = new Kitap_islemleri();
ki.GetBookByName(this);

单一责任可以吗,还是有什么不同的方式?你能帮我么? 使用 somemethod(this) 有点奇怪,一开始是错的还是好的?你怎么看。我如何在不使用(this)的情况下获取数据?如果有办法,你能打到吗?

【问题讨论】:

  • 你的方法应该返回一个 DataTable,而不是接收一个 Form 引用并设置一个 UI 控件(你的方法应该对 UI 组件一无所知)。无论出于何种目的,您都可以在表单方面使用返回的数据。旁注:您正在存储一个 Connection 对象(您应该创建一个并就地处理它)而不是处理 SqlDataAdapter,它可以自行打开一个连接,顺便说一句。
  • 你能举个例子吗?
  • 关于如何写public DataTable GetBookByName() { }f1.dataGridView1.DataSource = GetBookByName();而不是public void GetBookByName(Yönetici f1)? BTW2,您只需要一种方法来返回带有您的书籍的 DataTable。过滤和排序可以在 UI 端动态应用(与 UI 要求相关),使用 DataTable.defaultView 或 BindingSource。
  • 我改了 GetBookByName(string text,DataGridView dgv) 我猜它已经解决了
  • 不。不要将任何 UI 元素传递给这些方法。

标签: c# sql winforms class datagridview


【解决方案1】:

我建议您根据需要更改方法参数和返回类型。您的查询似乎只需要 1 个条件。

public DataTable GetBookByName(string bookName)
{
    conn.Open();
    SqlCommand cmd = new SqlCommand("Select * from Kitaplar where Kitap_Adi like '%" + bookName.Trim() + "%'", conn); 
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    conn.Close();
    return dt;
}

因此,您不需要数据访问层上的所有 Yonetici 页面,并且使用返回的 DataTable,您可以将其绑定到表示层上的 gridview。

var bookName = f1.textBox1.Text;
f1.dataGridView1.DataSource = ki.GetBookByName(bookname);

第 2 部分

public DataTable GetBooks(string filter, string criteria)
{
conn.Open();
SqlCommand cmd = new SqlCommand("Select * from Kitaplar where " + filter + " like '%" + criteria.Trim() + "%'", conn); 
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
conn.Close();
return dt;
}

用法

GetBooks("Kitap_Adi", "name");
GetBooks("Yazar", "author");
GetBooks("Tür", "kind")

【讨论】:

  • Nerden baksan kral hareket aga 这就是我要找的……谢谢!
  • 只要您按照规则提出问题,社区中的每个人都会很乐意为您提供帮助。 Rica ederim :)
  • 那么让它搜索多个呢?我的意思是 GetBookBy(string bookname,string by) 和 sqlcommand 是 Select * from Kitaplar where "+by+" like ....?单一责任可以吗?我认为它必须是。
  • 代码已经是单一责任人了。除了获取数据之外,它没有任何责任。有了你所说的,你可以避免代码重复。我用“part2”更新了代码以进行演示,请检查并确保您应该始终应用您的代码进行此类改进。
  • 非常感谢,我已经找了 3-4 天了,然后一位英雄出现并回答了你想知道的问题。不是所有的英雄都穿斗篷
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2017-12-22
相关资源
最近更新 更多