Форма предназначена для отображения любых справочных сведений, содержащихся в базе данных. Информацию о структуре таблицы данных получает с помощью специального метода статического класса MySQL. Автоматически определяет ссылки на другие таблицы и сама определяет необходимый тип колонок для таблицы. На основании полученной структуры таблицы базы данных форма генерирует строки запросов для выборки, вставки исправления и удаления данных в таблице БД. При необходимости выбора значений из нескольких форма автоматически формирует строки запросов для получения данных для выбора значения. Поля таблицы, которые не предназначены для редактирования форма делает нередактируемыми. При наличии в структуре таблицы БД комментария он используется в качестве заголовка для столбца.
using System;
using System.Data;
using System.Data.Odbc;
using System.Windows;
using System.Windows.Forms;
using System.Linq; namespace winOrders
{
public partial class frmListManager : Form
{
private OdbcDataAdapter adapter;
private DataTable dt = new DataTable();
private Form1 MainForm; // Имя таблицы БД для отображения списка
public string Table { get; private set; } public frmListManager(string tblName, Form1 mForm)
{
InitializeComponent(); MainForm = mForm;
bindingSource1.DataSource = dt;
Table = tblName.Trim();
this.Text = Table.GetSynonym();
// Получение информации о структуре таблицы
DataTable tableStructure = Table.TableStructure(); //"Linq-заклинания" для получения строки SQL запросов и параметров к ней
var SQLparams = tableStructure.AsEnumerable() // Адаптация DataTable для Linq
.Where(row => row.GetName() != "id") // Нужны все, кроме "id"
.Select(row => row.GetParameter()); // "Превращение" в OdbcParameter
var SqlVars =
tableStructure.AsEnumerable() // Адаптация DataTable для Linq
.Where(row => row.GetName() != "id") // Нужны все, кроме "id"
.Select(row => " `" + row.GetName() + "` = ?") // Формирование переменной SQL-запроса
.Aggregate((a, b) => a + ", " + b); // Сборка в одну строку adapter = MySQL.GetAdapter("select * from " + Table);
adapter.RowUpdated += da_RowUpdated; // Подписка нужна для обновления поля id в dt
adapter.InsertCommand =
new OdbcCommand("INSERT INTO " + Table + " SET" + SqlVars, MySQL.Connection);
foreach (var row in SQLparams) adapter.InsertCommand.Parameters.Add(row);
adapter.UpdateCommand =
new OdbcCommand("UPDATE " + Table + " SET" + SqlVars +
" WHERE id = ?", MySQL.Connection);
foreach (var row in SQLparams) adapter.UpdateCommand.Parameters.Add(row);
adapter.UpdateCommand.Parameters.Add("@id", OdbcType.Int, 0, "id");
adapter.DeleteCommand =
new OdbcCommand("DELETE FROM " + Table + " WHERE id = ?", MySQL.Connection);
adapter.DeleteCommand.Parameters.Add("@id", OdbcType.Int, 0, "id");
adapter.Fill(dt); DataGridViewColumn dgvCol;
foreach (DataRow row in tableStructure.Rows)
{
if (row.GetCol("rTab") == "")
{
if (row.GetCol("Type") == "tinyint") // у нас это булево
{
var tmpCol = new DataGridViewCheckBoxColumn();
tmpCol.DataPropertyName = row.GetName();
tmpCol.TrueValue = 1;
tmpCol.FalseValue = 0;
tmpCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; dgvCol = tmpCol;
}
else
{
var tmpCol = new DataGridViewTextBoxColumn();
tmpCol.DataPropertyName = row.GetName(); dgvCol = tmpCol;
}
}
else // Эта колонка - внешняя ссылка
{
var tmpCol = new DataGridViewComboBoxColumn();
tmpCol.DataPropertyName = row.GetName();
tmpCol.DataSource = new DataTable(row.GetCol("rTab"));
tmpCol.ValueMember = row.GetCol("rCol");
tmpCol.DisplayMember = "Name";
tmpCol.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
MySQL.GetAdapter("select `"
+ row.GetCol("rCol") + "`, Name from "
+ row.GetCol("rTab")).Fill((DataTable)tmpCol.DataSource); dgvCol = tmpCol;
}
dgvCol.Name = row.GetName(); if (row.GetSynonym() != "") dgvCol.HeaderText = row.GetSynonym();
if (row.GetName() == "id")
{// идентификатор редактировать нельзя
dgvCol.ReadOnly = true;
dgvCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
}
dataGridView1.Columns.Add(dgvCol);
} if (Table == "users")
{// Отсюда у пользователей можно поменять только полное наименование,
// добавлять/удалять, менять имя/пароль можно только через администратор БД
dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.Columns["Name"].ReadOnly = true;
toolStripButton2.Visible = false;
}
} void da_RowUpdated(object sender, OdbcRowUpdatedEventArgs e)
{
if (e.Errors == null && e.StatementType == StatementType.Insert)
{// при добавлении новой строки автоинкрементное поле id
// само собой в гриде не появляется, надо его так "выковыривать"
e.Row["id"] = MySQL.GetLastId().ToString();
}
} private void frmListManager_FormClosed(object sender, FormClosedEventArgs e)
{
MainForm.OpenWindows.Remove(Table);
} private void frmListManager_Shown(object sender, EventArgs e)
{
//connection.Open();
} private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (dt.Rows.Count < dataGridView1.Rows.Count)
{ // Добавлена строка или ячейка - чекбокс
if (dataGridView1[e.ColumnIndex, e.RowIndex] is DataGridViewCheckBoxCell)
{ // какой-то странный глюк с чекбоксами
if (dt.Rows.Count < (dataGridView1.Rows.Count-1))
{ // Количество строк другое почему-то при добавлении
bindingSource1.EndEdit();
adapter.Update(dt);
}
else if(dt.Rows[e.RowIndex][e.ColumnIndex].ToString() != dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString())
{
bindingSource1.EndEdit();
adapter.Update(dt);
}
}
else
{
bindingSource1.EndEdit();
adapter.Update(dt);
}
}
else if (dt.Rows[e.RowIndex][e.ColumnIndex].ToString() != dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString())
{ // Изменено значение
bindingSource1.EndEdit();
adapter.Update(dt);
}
} private void toolStripButton2_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Вы действительно хотите удалить строку?",
"Удаление",
MessageBoxButtons.OKCancel);
if (result == DialogResult.OK)
{
dataGridView1.Rows.Remove(dataGridView1.CurrentRow);
adapter.Update(dt);
}
}
}
}
|
6.5Форма редактирования заявки покупателя
6.6Форма редактирования заявки поставщику
6.8Форма редактирования реализации товаров
|