Как связать 2 datagridview c
Добрый день. Прошу помочь с заезженной темой — как связать 2 datagridview (при перемещении по строкам главной таблицы Клиентов в дочерней таблице Заказов должны отображаться заказы выбранного клиента). Посмотрел данный вопрос http://www.sql.ru/forum/actualthread.aspx?tid=379776 и http://www.gotdotnet.ru/forums/2/51384/. Ничего не получается в виду отсутствия опыта. Есть таблицы Customer (главная) и Orders (дочерняя), созданные в mssql server 2008 rc.
Представление БД:

.
Данные таблицы я кинул на форму:

.
Автоматически создались следующие компоненты:

.
Каким образом реализовать данную связку? Подскажите, пожалуйста, какую литературу можно почитать чайникам по этому вопросу? Спасибо.
| samouelson |
| Посмотреть профиль |
| Найти ещё сообщения от samouelson |
Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms
Элемент управления DataGridView поддерживает стандартную модель привязки данных Windows Forms, допускающую привязку к разнообразным источникам данных. Обычно выполняется привязка к объекту BindingSource, который управляет взаимодействием с источником данных. Компонент BindingSource может быть любым источником данных Windows Forms, что обеспечивает большую гибкость при выборе или изменении расположения данных. Дополнительные сведения об источниках данных, поддерживаемых элементом управления DataGridView, см. в разделе Общие сведения об элементе управления DataGridView.
Visual Studio имеет обширную поддержку привязки данных к элементу управления DataGridView. Дополнительные сведения см. в статье Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms с помощью конструктора.
Подключение элемента управления DataGridView к данным
- Реализуйте метод, обрабатывающий получение данных. В примере кода ниже реализован метод GetData , инициализирующий компонент SqlDataAdapter и использующий его для заполнения DataTable. Затем он привязывает DataTable к BindingSource.
- В обработчике событий Load формы привяжите элемент управления DataGridView к компоненту BindingSource и вызовите метод GetData для получения данных.
Пример
Этот полный пример кода извлекает данные из базы данных для заполнения элемента управления DataGridView в форме Windows. Форма также содержит кнопки для повторной загрузки данных и отправки изменений в базу данных.
Для этого примера требуются:
- доступ к примеру базы данных Northwind. Дополнительные сведения об установке примера базы данных Northwind см. в разделе Получение примеров баз данных для примеров кода ADO.NET;
- ссылки на сборки System, System.Windows.Forms, System.Data и System.Xml.
Чтобы выполнить сборку и запуск этого примера, вставьте код в файл кода Form1 в новом проекте Windows Forms. Сведения о сборке из командной строки C# или Visual Basic см. в разделах Сборка из командной строки с помощью csc.exe или Сборка из командной строки.
Заполните переменную connectionString в примере значениями для подключения к примеру базы данных Northwind на SQL Server. Проверка подлинности Windows, также называемая встроенной безопасностью, является более безопасным способом подключения к базе данных, чем хранение пароля в строке подключения. Дополнительные сведения о безопасности подключений см. в разделе Защита сведений о подключении.
using System; using System.Data; using System.Data.SqlClient; using System.Globalization; using System.Windows.Forms; namespace WindowsFormsApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); >> > public class Form1 : Form < private DataGridView dataGridView1 = new DataGridView(); private BindingSource bindingSource1 = new BindingSource(); private SqlDataAdapter dataAdapter = new SqlDataAdapter(); private Button reloadButton = new Button(); private Button submitButton = new Button(); [STAThread()] public static void Main() < Application.Run(new Form1()); >// Initialize the form. public Form1() < dataGridView1.Dock = DockStyle.Fill; reloadButton.Text = "Reload"; submitButton.Text = "Submit"; reloadButton.Click += new EventHandler(ReloadButton_Click); submitButton.Click += new EventHandler(SubmitButton_Click); FlowLayoutPanel panel = new FlowLayoutPanel < Dock = DockStyle.Top, AutoSize = true >; panel.Controls.AddRange(new Control[] < reloadButton, submitButton >); Controls.AddRange(new Control[] < dataGridView1, panel >); Load += new EventHandler(Form1_Load); Text = "DataGridView data binding and updating demo"; > private void GetData(string selectCommand) < try < // Specify a connection string. // Replace with the SQL Server for your Northwind sample database. // Replace "Integrated Security=True" with user login information if necessary. String connectionString = "Data Source=;Initial Catalog=Northwind;" + "Integrated Security=True"; // Create a new data adapter based on the specified query. dataAdapter = new SqlDataAdapter(selectCommand, connectionString); // Create a command builder to generate SQL update, insert, and // delete commands based on selectCommand. SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); // Populate a new data table and bind it to the BindingSource. DataTable table = new DataTable < Locale = CultureInfo.InvariantCulture >; dataAdapter.Fill(table); bindingSource1.DataSource = table; // Resize the DataGridView columns to fit the newly loaded content. dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); > catch (SqlException) < MessageBox.Show("To run this example, replace the value of the " + "connectionString variable with a connection string that is " + "valid for your system."); >> private void Form1_Load(object sender, EventArgs e) < // Bind the DataGridView to the BindingSource // and load the data from the database. dataGridView1.DataSource = bindingSource1; GetData("select * from Customers"); >private void ReloadButton_Click(object sender, EventArgs e) < // Reload the data from the database. GetData(dataAdapter.SelectCommand.CommandText); >private void SubmitButton_Click(object sender, EventArgs e) < // Update the database with changes. dataAdapter.Update((DataTable)bindingSource1.DataSource); >>
Imports System.Data.SqlClient Imports System.Windows.Forms Public Class Form1 Inherits Form Private dataGridView1 As New DataGridView() Private bindingSource1 As New BindingSource() Private dataAdapter As New SqlDataAdapter() Private WithEvents ReloadButton As New Button() Private WithEvents SubmitButton As New Button() Public Shared Sub Main() Application.Run(New Form1()) End Sub ' Initialize the form. Public Sub New() dataGridView1.Dock = DockStyle.Fill ReloadButton.Text = "Reload" SubmitButton.Text = "Submit" Dim panel As New FlowLayoutPanel With < .Dock = DockStyle.Top, .AutoSize = True >panel.Controls.AddRange(New Control() ) Controls.AddRange(New Control() ) Text = "DataGridView data binding and updating demo" End Sub Private Sub GetData(ByVal selectCommand As String) Try ' Specify a connection string. ' Replace with the SQL Server for your Northwind sample database. ' Replace "Integrated Security=True" with user login information if necessary. Dim connectionString As String = "Data Source=;Initial Catalog=Northwind;" + "Integrated Security=True;" ' Create a new data adapter based on the specified query. dataAdapter = New SqlDataAdapter(selectCommand, connectionString) ' Create a command builder to generate SQL update, insert, and ' delete commands based on selectCommand. Dim commandBuilder As New SqlCommandBuilder(dataAdapter) ' Populate a new data table and bind it to the BindingSource. Dim table As New DataTable With < .Locale = Globalization.CultureInfo.InvariantCulture >dataAdapter.Fill(table) bindingSource1.DataSource = table ' Resize the DataGridView columns to fit the newly loaded content. dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader) Catch ex As SqlException MessageBox.Show("To run this example, replace the value of the " + "connectionString variable with a connection string that is " + "valid for your system.") End Try End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load ' Bind the DataGridView to the BindingSource ' and load the data from the database. dataGridView1.DataSource = bindingSource1 GetData("select * from Customers") End Sub Private Sub ReloadButton_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles ReloadButton.Click ' Reload the data from the database. GetData(dataAdapter.SelectCommand.CommandText) End Sub Private Sub SubmitButton_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles SubmitButton.Click ' Update the database with changes. dataAdapter.Update(CType(bindingSource1.DataSource, DataTable)) End Sub End Class
См. также
- DataGridView
- DataGridView.DataSource
- BindingSource
- Отображение данных в элементе управления DataGridView в Windows Forms
- Защита сведений о подключении
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Соединение двух DataTable и вывод в DataGridView
Добрый день. есть такой вопрос. есть 2 DataTable, которые заполняются с хранимых процедур. одна таблица имеет вид:
Нужно соединить эти 2 DataTable и вывести в DataGridView таблицу в таком виде:
ID в таблицах совпадают и нужно по ним выводить. тобиш нужно взять в столбцы вывести Имена с первой таблицы, причем следование должно быть в соответствии с полем PLACE. например если там будет поле | SomeGuid | SomeData | 4 |, то этот столбец должен занимать 4-ый столбец. Значение поля Value должно заполнено в соответствии с именем(поле Name) и датой (поле DATE )
Как лучше и более правильно это реализовать программно?
Проект на 2 фреймворке, потому Linq тоже не получится использовать.
1 ответ
15 ноября 2012 года
421 / / 03.01.2009
private void Form1_Load ( object sender, EventArgs e )
<
Data1 = File . ReadAllLines ( «Data1.txt» , Encoding . Default ) ;
if ( Data1 != null )
<
SetColumn ( data1, Data1, «ID» , «Name» , «Place» ) ;
>
Data2 = File . ReadAllLines ( «Data2.txt» , Encoding . Default ) ;
if ( Data2 != null )
<
SetColumn ( data2, Data2, «ID» , «Date» , «Value» ) ;
>
dgView ( ) ;
private DataTable data1 = new DataTable ( ) ;
private DataTable data2 = new DataTable ( ) ;
private void dgView ( )
<
DataGridView dataGridView1 = new DataGridView ( ) ;
dataGridView1 . Dock = DockStyle . Fill ;
dataGridView1 . AllowUserToAddRows = false ;
dataGridView1 . AllowUserToDeleteRows = false ;
dataGridView1 . AllowUserToOrderColumns = true ;
dataGridView1 . AllowUserToResizeColumns = true ;
dataGridView1 . AllowUserToResizeRows = true ;
dataGridView1 . ColumnHeadersDefaultCellStyle . Alignment = DataGridViewContentAlignment . MiddleCenter ;
dataGridView1 . RowsDefaultCellStyle . Alignment = DataGridViewContentAlignment . MiddleCenter ;
this . Controls . Add ( dataGridView1 ) ;
DataGridViewColumn newColumn = null ;
DataGridViewRow newRow = new DataGridViewRow ( ) ;
dataGridView1 . RowTemplate = newRow ;
for ( int idx = 0 ; idx < data1 . Columns . Count ; idx ++ )
<
if ( data1 . Columns [ idx ] . ColumnName != «ID» ) //&& data1.Columns[idx].ColumnName != «Place»)
<
newColumn = new DataGridViewColumn ( ) ;
newColumn . Visible = true ;
newColumn . SortMode = DataGridViewColumnSortMode . NotSortable ;
newColumn . ReadOnly = true ;
newColumn . DefaultCellStyle . Alignment = DataGridViewContentAlignment . MiddleCenter ;
newColumn . HeaderText = data1 . Columns [ idx ] . ColumnName ;
dataGridView1 . Columns . Add ( newColumn ) ;
>
>
for ( int idx = 0 ; idx < data2 . Columns . Count ; idx ++ )
<
if ( data2 . Columns [ idx ] . ColumnName != «ID» )
<
newColumn . Visible = true ;
newColumn . SortMode = DataGridViewColumnSortMode . NotSortable ;
newColumn . ReadOnly = true ;
newColumn . DefaultCellStyle . Alignment = DataGridViewContentAlignment . MiddleCenter ;
newColumn = new DataGridViewColumn ( ) ;
newColumn . HeaderText = data2 . Columns [ idx ] . ColumnName ;
dataGridView1 . Columns . Add ( newColumn ) ;
>
>
SetDataTodgView ( dataGridView1 ) ;
DataGridViewColumn needColumn = null ;
for ( int idx = 0 ; idx < dataGridView1 . Columns . Count ; idx ++ )
<
if ( dataGridView1 . Columns [ idx ] . HeaderText == «Place» )
<
needColumn = dataGridView1 . Columns [ idx ] ;
break ;
>
>
dataGridView1 . Sort ( needColumn, ListSortDirection . Ascending ) ;
dataGridView1 . Columns . Remove ( needColumn ) ;
>
private void SetDataTodgView ( DataGridView dgv )
<
int ColInd = — 1 ;
DataGridViewTextBoxCell Name = null ;
DataGridViewTextBoxCell Place = null ;
DataGridViewTextBoxCell Date = null ;
DataGridViewTextBoxCell mValue = null ;
for ( int gdx = 0 ; gdx < data2 . Columns . Count ; gdx ++ )
<
if ( data2 . Columns [ gdx ] . ColumnName == «ID» )
<
ColInd = gdx ;
break ;
>
>
for ( int idx = 0 ; idx < data1 . Rows . Count ; idx ++ )
<
int IdParent = — 1 ;
for ( int jdx = 0 ; jdx < data1 . Columns . Count ; jdx ++ )
switch ( data1 . Columns [ jdx ] . ColumnName )
<
case «Name» :
Name = new DataGridViewTextBoxCell ( ) ;
Name . Value = data1 . Rows [ idx ] . Field < string >( jdx ) ;
break ;
case «Place» :
Place = new DataGridViewTextBoxCell ( ) ;
Place . Value = data1 . Rows [ idx ] . Field < string >( jdx ) ;
break ;
default :
IdParent = Convert . ToInt32 ( data1 . Rows [ idx ] . Field < string >( jdx ) ) ;
break ;
>
>
for ( int kdx = 0 ; kdx < data2 . Rows . Count ; kdx ++ )
<
if ( IdParent == Convert . ToInt32 ( data2 . Rows [ kdx ] . Field < string >( ColInd ) ) )
<
for ( int ldx = 0 ; ldx < data2 . Columns . Count ; ldx ++ )
<
switch ( data2 . Columns [ ldx ] . ColumnName )
<
case «Date» :
Date = new DataGridViewTextBoxCell ( ) ;
Date . Value = data2 . Rows [ kdx ] . Field < string >( ldx ) ;
break ;
case «Value» :
mValue = new DataGridViewTextBoxCell ( ) ;
mValue . Value = data2 . Rows [ kdx ] . Field < string >( ldx ) ;
break ;
>
>
break ;
>
>
DataGridViewRow newRow = new DataGridViewRow ( ) ;
newRow . Cells . AddRange ( Name, Place, Date, mValue ) ;
dgv . Rows . Add ( newRow ) ;
>
>
private void SetColumn ( DataTable myTable, string [ ] Arr, string Col1, string Col2, string Col3 )
<
for ( int idx = 0 ; idx < 3 ; idx ++ )
<
DataColumn newColumn = new DataColumn ( ) ;
switch ( idx )
<
case 0 :
newColumn . ColumnName = Col1 ;
newColumn . DataType = Type . GetType ( «System.String» ) ;
newColumn . ReadOnly = false ;
break ;
case 1 :
newColumn . ColumnName = Col2 ;
newColumn . DataType = Type . GetType ( «System.String» ) ;
newColumn . ReadOnly = false ;
break ;
case 2 :
newColumn . ColumnName = Col3 ;
newColumn . DataType = Type . GetType ( «System.String» ) ;
newColumn . ReadOnly = false ;
break ;
>
myTable . Columns . Add ( newColumn ) ;
>
for ( int idx = 0 ; idx < Arr . Length ; idx ++ )
<
SetInfo ( myTable, Arr [ idx ] , Col1, Col2, Col3 ) ;
>
>
private void SetInfo ( DataTable myTable, string info, string Col1, string Col2, string Col3 )
<
string Line = string . Empty ;
int flag = 0 ;
DataRow newRow = myTable . NewRow ( ) ;
for ( int idx = 0 ; idx < info . Length ; idx ++ )
<
if ( info [ idx ] != ‘ ‘ )
<
if ( idx != info . Length — 1 )
<
Line += Convert . ToString ( info [ idx ] ) ;
>
else
<
flag ++;
Line += Convert . ToString ( info [ idx ] ) ;
if ( flag == 3 )
<
newRow [ Col3 ] = Line ;
>
>
>
else
flag ++;
if ( flag == 1 )
<
newRow [ Col1 ] = Line ;
>
if ( flag == 2 )
<
newRow [ Col2 ] = Line ;
>
Line = string . Empty ;
>
>
myTable . Rows . Add ( newRow ) ;
>
Связываем две таблицы БД в DataGridView
Привет всем! Сегодня я покажу как связать две таблицы из БД имеющие общую связь один ко многим. Пример приведу достаточно простой, так как он не будет нам усложнять принцип понимание.
Но начнем все по порядку, по пунктам в начале создаем БД в VS в своем проекте. Далее нам необходимо создать таблицы, либо использовать мой готовый скрипт.
Transact-SQL
USE [ TestDB2 ]
/****** Object: Table [dbo].[Пол] Script Date: 12.11.2019 15:57:00 ******/
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [ dbo ] . [ Пол ] (
[ ID_ Пола ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ Пол ] [ nvarchar ] ( 50 ) NOT NULL ,
CONSTRAINT [ PK_ Пол ] PRIMARY KEY CLUSTERED
[ ID_ Пола ] ASC
) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ]
) ON [ PRIMARY ]
/****** Object: Table [dbo].[Человек] Script Date: 12.11.2019 15:57:00 ******/
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [ dbo ] . [ Человек ] (
[ ID_ Человека ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ Имя ] [ nvarchar ] ( 50 ) NOT NULL ,
[ Пол ] [ int ] NOT NULL ,
CONSTRAINT [ PK_ Человек ] PRIMARY KEY CLUSTERED
[ ID_ Человека ] ASC
) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ]
) ON [ PRIMARY ]
ALTER TABLE [ dbo ] . [ Человек ] WITH CHECK ADD CONSTRAINT [ FK_ Человек _ Пол ] FOREIGN KEY ( [ Пол ] )
REFERENCES [ dbo ] . [ Пол ] ( [ ID_ Пола ] )
ALTER TABLE [ dbo ] . [ Человек ] CHECK CONSTRAINT [ FK_ Человек _ Пол ]

Теперь добавим DataSet и перетащить на форму две таблицы, выглядеть будет как на рисунке сверху. VS с генерирует код. И у нас появятся адаптеры в компонентах, нам так же необходимо их переместить на форму. А на самой форме расположить два DataGridView

Следующим шаг будет связывание данных БД с DataGridView. Для этого выбираем наш DataGridView нажатием мыши и в правом верхнем углу жмем стрелочку. Открывается список источников данных, выбираем наш проект и ищем DataSet тот что мы создали, раскрываем его и выбираем первую таблицу «Пол».

Теперь осталось связать вторую таблицу с данными первой таблицы.

Для этого выбираем не таблицу, а связь с таблицей, как показано на рисунке выше. Создаем событие Form Load и помещаем следующий код: