Как показать информацию во втором gridview - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Nordwind DB

Вот так выглядит мое приложение:

App

Я хочу выбрать строку в первом виде сетки и показатьЗаказы от этих клиентов во втором виде сетки также хотелось бы отфильтровать 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 также я думаю, что мне нужно обновить форму, но я понятия не имею, как это сделать.

Может ли кто-нибудь дать мне правильный код и, возможно, даже объяснение того, что часть делает и что?

Заранее спасибо, если вам нужна дополнительная информация, пожалуйста, скажите это.

1 Ответ

1 голос
/ 04 ноября 2019

Не делайте этого в 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-сервер может кэшировать план выполнения, поскольку командная строка не изменяется для разных клиентов.

Поместите соединение, команду и читателя в операторы usingчтобы они автоматически удалялись.


Фильтрация по текстовому полю работает почти так же. Перезагрузите клиентов в событии TextChanged или Validated или Leave текстового поля:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...