Как заполнить сетку данных набором данных - PullRequest
0 голосов
/ 03 ноября 2019
private void Form1_Load(object sender, EventArgs e)
{
    var select = "SELECT * FROM Products";

    var c = new SqlConnection(@"Data Source=DESKTOP-4D1RO14\SQLEXPRESS;Initial Catalog=master;Integrated Security=True"); // Your Connection String here

    var dataAdapter = new SqlDataAdapter(select, c);

    var commandBuilder = new SqlCommandBuilder(dataAdapter);
    var ds = new DataSet();
    dataAdapter.Fill(ds);

    dataGridView1.DataSource = ds.Tables[0];
}

Мне нужно показать продукт в виде таблицы, затем, когда я щелкаю по строке, отображается название поставщика. Я думаю, что для этого мне нужны отношения для таблицы продуктов и поставщиков, верно?

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Как вы сказали, вам нужно добавить внешний ключ между двумя таблицами.

Вы можете попробовать следующий код, чтобы показать имя поставщика из текущего представления данных.

private void Form1_Load(object sender, EventArgs e)
        {
            var select = "SELECT * FROM Product";

            var c = new SqlConnection(@""); // Your Connection String here

            var dataAdapter = new SqlDataAdapter(select, c);

            var commandBuilder = new SqlCommandBuilder(dataAdapter);
            var ds = new DataSet();
            dataAdapter.Fill(ds);

            dataGridView1.DataSource = ds.Tables[0];
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int value =Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[0].Value);
            SqlConnection connection = new SqlConnection(@""); // Your Connection String here
            connection.Open();
            string sql = string.Format("select SupplierName from Supplier inner join Product On Supplier.NewId = {0}", value);
            SqlCommand command = new SqlCommand(sql,connection);
            SqlDataReader reader = command.ExecuteReader();
            while(reader.Read())
            {
                textBox1.Text = reader["SupplierName"].ToString();
            }

        }

Результат: enter image description here

0 голосов
/ 03 ноября 2019

Не обязательно;Вы можете просто извлечь текущую строку из сетки всякий раз, когда событие запускается, чтобы указать, что текущая строка изменилась, а затем извлечь идентификатор поставщика из базовой строки. Однако в таких ситуациях я предпочитаю использовать BindingSource и подключиться к событию CurrentChanged .

Вы окажете большую услугу, если добавите строго типизированный набор данных в свойпроект, подключите его к вашей базе данных и используйте табличные адаптеры и типизированные таблицы данных. После того, как вы выполнили этот шаг (добавьте новый набор данных в проект, откройте его, щелкните правой кнопкой мыши поверхность и выберите новый табличный адаптер, заполните детали подключения и select * from supplers, повторите для продуктов), вы можете открыть окно Источники данных,перетащите узлы «Поставщики» и «Продукты» в форму, и вы получите сеточное представление для каждого из них, связанное через источник связывания с одним экземпляром набора данных, который имеет обе таблицы. Затем вы можете закодировать этот обработчик события в ProductBindingSource:

private void ProductBindingSource_CurrentChanged(object sender, EventArgs e)
{
    if(ProductBindingSource.Current == null) return;

    var pr = (ProductBindingSource.Current as DataRowView).Row as MyDataSetName.ProductsRow;

    var ta = new SuppliersTableAdapter(); //you might even have a suppliersTableAdapter on the form; no need to make a new one if this is the case

    ta.Fill(dataset1.Suppliers, pr.SupplierID);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...