如何在第二个GridView中显示信息

我使用Nordwind数据库

这是我的应用的外观:

如何在第二个GridView中显示信息

我想从第一个网格视图中选择一行,并在第二个网格视图中显示那些客户的订单,我也想在第一个网格视图中过滤1个或更多列。

GridView1:

private void Form1_Load(object sender,EventArgs e)
{
    SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Northwind.mdf;Integrated Security=True");conn.Open();

    SqlCommand cmd = new SqlCommand("select * from Customers",conn);

    SqlDataReader rdr = cmd.ExecuteReader();

    List<Customer> Customers = new List<Customer>();

    while (rdr.Read())
    {
        Customer c = new Customer();
        c.CustomerID = (string)rdr["CustomerID"];
        c.CompanyName = (string)rdr["CompanyName"];
        c.ContactName = (string)rdr["ContactName"];
        c.City = (string)rdr["City"];
        c.Country = (string)rdr["Country"];
        c.Phone = (string)rdr["Phone"];
        Customers.Add(c);
    }

    dataGridView1.DataSource = Customers;
}

GridView2:

private void dataGridView2_CellContentClick(object sender,DataGridViewCellEventArgs e)
{
    SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Northwind.mdf;Integrated Security=True"); 
    conn.Open();

    SqlCommand cmd = new SqlCommand("select * from Orders",conn);

    SqlDataReader rdr = cmd.ExecuteReader();

    List<Order> Orders = new List<Order>();

    while (rdr.Read())
    {
        Order o = new Order();
        o.OrderID = (int)rdr["OrderID"];
        o.OrderDate = (DateTime)rdr["OrderDate"];
        o.ShipName = (string)rdr["ShipName"];
        o.ShipCity = (string)rdr["ShipCity"];
        o.ShipCountry = (string)rdr["ShipCountry"];
        Orders.Add(o);
    }

    dataGridView2.DataSource = Orders;
}

选择整行:

        {
            Customer c = (Customer)dataGridView1.CurrentRow.databoundItem;
        }

我认为SqlCommand在GridView2中不好,而且我认为我需要更新表单,但是我不知道该怎么做。

有人可以给我正确的代码,甚至可以解释什么是什么部分?

如果您需要更多信息,请提前感谢。

qqleecs 回答:如何在第二个GridView中显示信息

请不要在CellContentClick事件处理程序中执行此操作,而应在SelectionChanged事件处理程序中执行此操作。订单必须包含CustomerID,可用于过滤WHERE子句:

private void dataGridView1_SelectionChanged(object sender,EventArgs e)
{
    if (dataGridView1.CurrentRow?.DataBoundItem is Customer customer) {
        var orders = new List<Order>();

        using (var conn = new SqlConnection(STR_Connection))
        using (var cmd = new SqlCommand("select * from Orders where CustomerID=@cid",conn)) {
            cmd.Parameters.Add("@cid",SqlDbType.NChar,5).Value = customer.CustomerID;

            conn.Open();
            using (SqlDataReader rdr = cmd.ExecuteReader()) {
                while (rdr.Read()) {
                    var o = new Order {
                        OrderID = (int)rdr["OrderID"],CustomerID = (string)rdr["CustomerID"],OrderDate = (DateTime)rdr["OrderDate"],ShipName = (string)rdr["ShipName"],ShipCity = (string)rdr["ShipCity"],ShipCountry = (string)rdr["ShipCountry"]
                    };
                    orders.Add(o);
                }
            }
        }

        dataGridView2.DataSource = orders;
    } else {
        dataGridView2.DataSource = null;
    }
}

将参数作为命令参数传递并将其连接到SQL命令字符串中很重要。这可能会导致SQL注入攻击(这里可能不是,但是在一般情况下...)。由于SQL-Server可以缓存执行计划,这也提高了查询的性能,因为命令字符串对于不同的客户不会改变。

将连接,命令和阅读器置于使用状态语句中,以自动处理它们。


通过文本框进行过滤的工作方式几乎相同。在文本框的TextChangedValidatedLeave事件中重新加载客户:

private void txtFilter_TextChanged(object sender,EventArgs e)
{
    LoadCustomers(txtFilter.Text);
}

以及在Load事件中:

private void Form1_Load(object sender,EventArgs e)
{
    LoadCustomers();
}

TextChanged与其他两个事件之间的区别在于,前者会为输入的每个字符触发。为了使其他人正常工作,必须离开文本框。

然后,您将不得不处理过滤器为空或不为空的两种情况。如果为空,请选择没有WHERE子句的客户(即返回所有行),或者根本不返回任何行(dataGridView1.DataSource = null;)。否则,设置适当的where子句。也许

WHERE CompanyName LIKE @filter OR ContactName LIKE @filter

然后将过滤器字符串嵌入%中。这是SQL中的通配符。

private void LoadCustomers(string filter = null) // Optional filter parameter
{
    string sql = "select * from Customers";
    SqlParameter filterParameter = null;
    if (!String.IsNullOrWhiteSpace(filter)) {
        sql += " WHERE CompanyName LIKE @filter OR ContactName LIKE @filter";
        filterParameter = new SqlParameter("@filter",SqlDbType.NVarChar) {
            Value = "%" + filter + "%" // Add wildcards.
        };
    }

    var Customers = new List<Customer>();
    using (var conn = new SqlConnection(STR_Connection))
    using (var cmd = new SqlCommand(sql,conn)) {
        if (filterParameter != null) {
            cmd.Parameters.Add(filterParameter);
        }
        conn.Open();
        using (var rdr = cmd.ExecuteReader()) {
            while (rdr.Read()) {
                var c = new Customer() {
                    CustomerID = (string)rdr["CustomerID"],CompanyName = (string)rdr["CompanyName"],ContactName = (string)rdr["ContactName"],City = (string)rdr["City"],Country = (string)rdr["Country"],Phone = (string)rdr["Phone"]
                };
                Customers.Add(c);
            }
        }
    }
    dataGridView1.DataSource = Customers;
}
本文链接:https://www.f2er.com/3164422.html

大家都在问