如何根据VS2012上另一个数据网格的选定行在数据网格上显示sql队列结果

Posted

技术标签:

【中文标题】如何根据VS2012上另一个数据网格的选定行在数据网格上显示sql队列结果【英文标题】:How to show sql queue results on data grid based on selected rows of another data grid on VS2012 【发布时间】:2014-02-04 14:44:58 【问题描述】:

这是我的代码:

public void loadGrid1() 
                con.Open();
                cmd = new SqlCommand(@"SELECT StudID, Stud_Lname, Stud_Fname FROM STUDENTS;",con);
                rdr = cmd.ExecuteReader();
                while (rdr.Read()) 
                    dataGridView2.Rows.Add(rdr[0].ToString(), rdr[1].ToString(), rdr[2].ToString());
                
                con.Close();


public void loadGrid3() 
                con.Open();
                cmd = new SqlCommand(@"SELECT Title, Author FROM Books INNER JOIN Borrow ON Borrow.BookID = Books.BookID WHERE Borrow.StudID = '"+dataGridView2.SelectedRows[0].Cells[0].Value.ToString()+"';", con);
                rdr = cmd.ExecuteReader();
                while (rdr.Read()) 
                    dataGridView3.Rows.Add(rdr[0].ToString(), rdr[1].ToString());
                
                con.Close();

loadGrid1 是我用来加载grid 1 内容的函数,而loadGrid3 应该显示所选学生从grid 1grid 3 上借阅的书籍。

我做错了什么?

【问题讨论】:

调试器是你的朋友 【参考方案1】:

首先,您的查询容易受到 sql 注入的影响。除此之外,您可能想检查这里创建的实际查询是什么,如果有的话:

SqlCommand(@"SELECT Title, Author FROM Books INNER JOIN Borrow ON Borrow.BookID = Books.BookID WHERE Borrow.StudID = '"+dataGridView2.SelectedRows[0].Cells[0].Value.ToString()+"';");

也许改成这样?:

string qryString = @"SELECT Title, Author FROM Books INNER JOIN Borrow ON Borrow.BookID = Books.BookID WHERE Borrow.StudID = '"+dataGridView2.SelectedRows[0].Cells[0].Value.ToString()+"';"

SqlCommand(qryString);

编辑 1:什么时候调用 Loadgrid3 方法?

编辑 2:尝试按如下方式更改代码:

public void loadGrid1()

    con.Open();
    cmd = new SqlCommand(@"SELECT StudID, Stud_Lname, Stud_Fname FROM STUDENTS;",con);
    rdr = cmd.ExecuteReader();
    while (rdr.Read())
    
        dataGridView2.Rows.Add(rdr[0].ToString(), rdr[1].ToString(), rdr[2].ToString());
    

    // check if dataGridView2 has more than 0 rows
    // and then select the first row by default
    if(dataGridView2.Rows.Count > 0)
    
        dataGridView2.Rows[0].Selected = true
    
    con.Close();

请记住,对于您的直接问题,这是一个肮脏的解决方案,但您可能想对 datagridview 事件等做一些事情。

【讨论】:

它在 MainForm_load 上加载 private void frmMain_Load(object sender, EventArgs e) LoadStudents();加载书(); LoadBorrow();加载查询();负载网格1(); loadGrid3();编辑:我在 sqlexpress 上尝试了查询,它工作得很好,它显示了特定人 brrwd 的书名和作者 由于这发生在表单加载上,并假设 dataGridView2 在调用 loadGrid3 时拥有所有数据;你确定dataGridView2 选择了任何行吗?请记住,这是一个新负载,可能不需要选择任何内容。 是的,我认为选择工作正常,我尝试在文本框中显示其值。您认为 loadGrid3() 可能不应该在主负载上吗? 'code' private void dataGridView2_SelectionChanged(object sender, EventArgs e) x= dataGridView2.SelectedRows[0].Cells[0].Value.ToString(); loadGrid3(); /* 它确实有效!谢谢你的想法先生(:*/ 考虑到这一点,您正在使用图书馆管理系统(这个看起来像一个)。你展示了所有的学生。现在,当用户单击网格中的一行时,会触发一个事件,该事件会获取该学生的书籍列表。如果这些事情仅在表单加载中完成,则没有事件触发器的范围/使用。您必须在网格中处理某种选择事件,然后使用 loadGrid3。

以上是关于如何根据VS2012上另一个数据网格的选定行在数据网格上显示sql队列结果的主要内容,如果未能解决你的问题,请参考以下文章

如何防止数据网格中的行在应用程序运行时闪烁

如何清除数据网格视图

WPF Datagrid 样式选定的行

当数据网格行在网格中不可见时,如何避免空引用异常?

我如何从 mvc 的剑道 ui 网格的下拉列表中获取选定的值

如何根据多列对 flex 数据网格进行排序?