Создал несколько таблиц через "Источники данных" и для полей с внешними ключами настроил отображение в виде ComboBox. Первая таблица работает, значения подставляются. А вторая выводит ошибку c# исключение в DataGridView недопустимое значение DataGridComboBoxCell. После закрытия кучи окошек с ошибкой таблица отображается и в ComboBox стоят значение id а не name и при попытке изменить таблицу опять куча окошек с ошибками.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace Retail
{
public partial class MainForm : Form
{
SqlDataAdapter ProductAdapter;
SqlDataAdapter VendorAdapter;
SqlDataAdapter UsersAdapter;
SqlDataAdapter SalesAdapter;
DataSet SalesDS;
DataSet UsersDS;
DataSet ProductDS;
DataSet VendorDS;
public MainForm()
{
InitializeComponent();
ProductDG.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ProductAdapter = new SqlDataAdapter("SELECT * FROM product;", EnterForm.sqlConn);
ProductDS = new DataSet();
ProductAdapter.Fill(ProductDS);
ProductDG.DataSource = ProductDS.Tables[0];
if (EnterForm.IsAdmin)
{
VendorAdapter = new SqlDataAdapter("SELECT * FROM vendor;", EnterForm.sqlConn);
VendorDS = new DataSet();
VendorAdapter.Fill(VendorDS);
VendorDG.DataSource = VendorDS.Tables[0];
VendorDG.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
UsersAdapter = new SqlDataAdapter("SELECT * FROM users;", EnterForm.sqlConn);
UsersDS = new DataSet();
UsersAdapter.Fill(UsersDS);
UsersDG.DataSource = UsersDS.Tables[0];
UsersDG.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
SalesAdapter = new SqlDataAdapter("SELECT * FROM sales;", EnterForm.sqlConn);
SalesDS = new DataSet();
SalesAdapter.Fill(SalesDS);
SalesDG.DataSource = SalesDS.Tables[0];
SalesDG.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}
else
{
VendorTabPage.Parent = null;
SalesTabPage.Parent = null;
UsersTabPage.Parent = null;
}
}
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void ProductAddBtn_Click(object sender, EventArgs e)
{
ProductDS.Tables[0].Rows.Add(ProductDS.Tables[0].NewRow());
}
private void ProductDelBtn_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in ProductDG.SelectedRows)
{
ProductDG.Rows.Remove(row);
}
}
private void ProductSaveBtn_Click(object sender, EventArgs e)
{
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ProductAdapter);
ProductAdapter.Update(ProductDS);
}
private void MainForm_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'retailDataSet.sales' table. You can move, or remove it, as needed.
this.salesTableAdapter.Fill(this.retailDataSet.sales);
// TODO: This line of code loads data into the 'retailDataSet.users' table. You can move, or remove it, as needed.
this.usersTableAdapter.Fill(this.retailDataSet.users);
// TODO: This line of code loads data into the 'retailDataSet.vendor' table. You can move, or remove it, as needed.
this.vendorTableAdapter.Fill(this.retailDataSet.vendor);
}
private void VendorAddBtn_Click(object sender, EventArgs e)
{
VendorDS.Tables[0].Rows.Add(VendorDS.Tables[0].NewRow());
}
private void VendorSaveBtn_Click(object sender, EventArgs e)
{
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(VendorAdapter);
VendorAdapter.Update(VendorDS);
}
private void VendorDeleteBtn_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in VendorDG.SelectedRows)
{
VendorDG.Rows.Remove(row);
}
}
private void UsersAddBtn_Click(object sender, EventArgs e)
{
UsersDS.Tables[0].Rows.Add(UsersDS.Tables[0].NewRow());
}
private void UsersSaveBtn_Click(object sender, EventArgs e)
{
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(UsersAdapter);
UsersAdapter.Update(UsersDS);
}
private void UsersDeleteBtn_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in UsersDG.SelectedRows)
{
UsersDG.Rows.Remove(row);
}
}
private void SalesAddBtn_Click(object sender, EventArgs e)
{
SalesDS.Tables[0].Rows.Add(SalesDS.Tables[0].NewRow());
}
private void SalesChangeBtn_Click(object sender, EventArgs e)
{
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(SalesAdapter);
SalesAdapter.Update(SalesDS);
}
private void SalesDeleteBtn_Click(object sender, EventArgs e)
{
foreach (DataGridViewRow row in SalesDG.SelectedRows)
{
SalesDG.Rows.Remove(row);
}
}
}
}