Sorka, że wczoraj nie odpisałem, ale jak napisałeś, że robisz wszystko ręcznie to mi się odechciało
Przecież w tym temacie http://forum.dobreprogramy.pl/datagridview-comboboxcolumn-dla-istniejacego-obiektu-t454139.html tłumaczyłem Ci, że pewne rzeczy można wygenerować i oszczędzić sobie pisania kodu. No ale jeśli chcesz to pisać samodzielnie, to niech tak będzie. Dziś usiądę do tego kodu i go poprawię, i wrzucę Ci jak to powinno wyglądać.
– Dodane 26.07.2011 (Wt) 19:51 –
Wszystkie poniższe klasy musisz dodać do projektu. Na potrzeby przykładu trochę zmieniłem strukturę bazy danych:
Tabela Uczen -> Kolumny: ID_uczen, Imie, Nazwisko, ID_wychowawca
Tabela Wychowawca -> Kolumny: ID_wychowawca, Imie, Nazwisko
MyOleDbTableDataAdapter.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
namespace DataAdapterDemov1.DAL
{
public abstract class MyOleDbTableDataAdapter
{
private OleDbCommandBuilder commandbuilder = null;
private OleDbDataAdapter dataAdapter = null;
protected OleDbConnection connection = null;
protected OleDbTransaction transaction = null;
protected List selectCommandList = null;
public MyOleDbTableDataAdapter(OleDbCommand selectCommand)
{
connection = selectCommand.Connection;
selectCommandList = new List() { selectCommand };
dataAdapter = new OleDbDataAdapter(selectCommand);
ClearBeforeFill = true;
GenerateMissingCommands();
}
public bool ClearBeforeFill { get; set; }
protected virtual void GenerateMissingCommands()
{
commandbuilder = new OleDbCommandBuilder(dataAdapter);
dataAdapter.UpdateCommand = commandbuilder.GetUpdateCommand();
dataAdapter.InsertCommand = commandbuilder.GetInsertCommand();
dataAdapter.DeleteCommand = commandbuilder.GetDeleteCommand();
}
public OleDbTransaction BeginTransaction()
{
try
{
if (connection.State == ConnectionState.Closed)
connection.Open();
transaction = connection.BeginTransaction();
return transaction;
}
catch (Exception ex)
{
if (connection.State == ConnectionState.Open)
connection.Close();
throw ex;
}
}
public void CommitTransaction()
{
try
{
transaction.Commit();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
}
}
public void RollbackTransaction()
{
try
{
transaction.Rollback();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (connection.State == ConnectionState.Open)
connection.Close();
}
}
public void AssignTransaction()
{
AssignTransaction(transaction);
}
public void AssignTransaction(OleDbTransaction transaction)
{
this.transaction = transaction;
dataAdapter.SelectCommand.Transaction = transaction;
dataAdapter.UpdateCommand.Transaction = transaction;
dataAdapter.InsertCommand.Transaction = transaction;
dataAdapter.DeleteCommand.Transaction = transaction;
}
public virtual int Fill(DataTable dataTable)
{
return Fill(dataTable, selectCommandList[0]);
}
protected virtual int Fill(DataTable dataTable, OleDbCommand selectCommand)
{
try
{
if (ClearBeforeFill)
dataTable.Clear();
dataAdapter.SelectCommand = selectCommand;
AssignTransaction();
return dataAdapter.Fill(dataTable);
}
catch (Exception ex)
{
throw ex;
}
}
public virtual int SaveChanges(DataTable table)
{
try
{
return dataAdapter.Update(table);
}
catch (Exception ex)
{
throw ex;
}
}
public void Dispose()
{
if (commandbuilder != null)
commandbuilder.Dispose();
if (transaction != null)
transaction.Dispose();
if (connection != null)
connection.Dispose();
if (dataAdapter != null)
dataAdapter.Dispose();
if (selectCommandList != null)
selectCommandList.GetEnumerator().Dispose();
}
}
}
UczenTableDataAdapter.cs
using System;
using System.Data;
using System.Data.OleDb;
namespace DataAdapterDemov1.DAL
{
public class UczenTableDataAdapter : MyOleDbTableDataAdapter
{
private static string _SQL_SELECT = "select ID_uczen, Imie, Nazwisko, ID_wychowawca from Uczen";
private static string _SQL_SELECT_BY_TEACHER_ID = "select ID_uczen, Imie, Nazwisko, ID_wychowawca from Uczen where (ID_wychowawca=?) or ((ID_wychowawca Is Null) and (IIf(IsNull(?),0,1)=0))";
public const string _COLUMN_NAME_ID = "ID_uczen";
public const string _COLUMN_NAME_NAME = "Imie";
public const string _COLUMN_NAME_SURNAME = "Nazwisko";
public const string _COLUMN_NAME_ID_TEACHER = "ID_wychowawca";
public UczenTableDataAdapter(string connectionString)
: base(new OleDbCommand(_SQL_SELECT, new OleDbConnection(connectionString)))
{ }
public UczenTableDataAdapter(OleDbConnection connection)
: base(new OleDbCommand(_SQL_SELECT, connection))
{ }
protected override void GenerateMissingCommands()
{
base.GenerateMissingCommands();
OleDbCommand selectCommand = new OleDbCommand(_SQL_SELECT_BY_TEACHER_ID, connection);
selectCommand.Parameters.Add("ID_wychowawca", OleDbType.LongVarWChar);
selectCommand.Parameters.Add("IsNull_ID_wychowawca", OleDbType.LongVarWChar);
selectCommandList.Add(selectCommand);
}
public virtual int FillByTeacherID(DataTable dataTable, int? teacherID)
{
try
{
OleDbCommand selectCommand = selectCommandList[1];
if (teacherID.HasValue)
{
selectCommand.Parameters[0].Value = teacherID.Value;
selectCommand.Parameters[1].Value = teacherID.Value;
}
else
{
selectCommand.Parameters[0].Value = DBNull.Value;
selectCommand.Parameters[1].Value = DBNull.Value;
}
return Fill(dataTable, selectCommand);
}
catch (Exception ex)
{
throw ex;
}
}
}
}
WychowawcaTableDataAdapter.cs
using System;
using System.Data.OleDb;
using System.Text;
namespace DataAdapterDemov1.DAL
{
public class WychowawcaTableDataAdapter : MyOleDbTableDataAdapter
{
private static string _SQL_SELECT = "select ID_wychowawca, Imie, Nazwisko from Wychowawca";
public const string _COLUMN_NAME_ID = "ID_wychowawca";
public const string _COLUMN_NAME_NAME = "Imie";
public const string _COLUMN_NAME_SURNAME = "Nazwisko";
public WychowawcaTableDataAdapter(string connectionString)
: base(new OleDbCommand(_SQL_SELECT, new OleDbConnection(connectionString)))
{ }
public WychowawcaTableDataAdapter(OleDbConnection connection)
: base(new OleDbCommand(_SQL_SELECT, connection))
{ }
}
}
CustomWychowawcaTableDataAdapter.cs
using System;
using System.Data.OleDb;
namespace DataAdapterDemov1.DAL
{
public class CustomWychowawcaTableDataAdapter : MyOleDbTableDataAdapter
{
private static string _SQL_SELECT = "select ID_wychowawca, Imie + ' ' + Nazwisko As Wychowawca from Wychowawca";
public const string _COLUMN_NAME_ID = "ID_wychowawca";
public const string _COLUMN_NAME_FULL_NAME = "Wychowawca";
public CustomWychowawcaTableDataAdapter(string connectionString)
: base(new OleDbCommand(_SQL_SELECT, new OleDbConnection(connectionString)))
{ }
public CustomWychowawcaTableDataAdapter(OleDbConnection connection)
: base(new OleDbCommand(_SQL_SELECT, connection))
{ }
}
}
Form1.cs
using System;
using System.Windows.Forms;
using DataAdapterDemov1.DAL;
using System.Data;
namespace DataAdapterDemov1
{
public partial class Form1 : Form
{
private UczenTableDataAdapter uczenTableDataAdapter;
private CustomWychowawcaTableDataAdapter customWychowawcaTableDataAdapter;
private DataTable uczenDataTable;
private DataTable customWychowawcaDataTable;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
customWychowawcaTableDataAdapter = new CustomWychowawcaTableDataAdapter(Properties.Settings.Default.bazaConnectionString);
uczenTableDataAdapter = new UczenTableDataAdapter(Properties.Settings.Default.bazaConnectionString);
customWychowawcaDataTable = new DataTable();
uczenDataTable = new DataTable();
refreshButton_Click(null, null);
GenerateDataGridViewColumns();
bindingSource1.DataSource = uczenDataTable;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
uczenDataTable.Dispose();
customWychowawcaDataTable.Dispose();
}
private void refreshButton_Click(object sender, EventArgs e)
{
try
{
customWychowawcaTableDataAdapter.Fill(customWychowawcaDataTable);
uczenTableDataAdapter.Fill(uczenDataTable);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void SaveButton_Click(object sender, EventArgs e)
{
try
{
uczenTableDataAdapter.BeginTransaction();
uczenTableDataAdapter.AssignTransaction();
uczenTableDataAdapter.SaveChanges(uczenDataTable);
uczenTableDataAdapter.CommitTransaction();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
uczenTableDataAdapter.RollbackTransaction();
}
finally
{
refreshButton_Click(null, null);
}
}
private void GenerateDataGridViewColumns()
{
dataGridView1.AutoGenerateColumns = false;
dataGridView1.Columns.Clear();
for (int i = 0; i < uczenDataTable.Columns.Count; i++)
{
if (uczenDataTable.Columns[i].ColumnName.CompareTo(UczenTableDataAdapter._COLUMN_NAME_ID_TEACHER) == 0)
{
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
column.DataPropertyName = UczenTableDataAdapter._COLUMN_NAME_ID_TEACHER;
column.HeaderText = "Wychowawca";
column.Name = UczenTableDataAdapter._COLUMN_NAME_ID_TEACHER;
column.DataSource = customWychowawcaDataTable;
column.DisplayMember = CustomWychowawcaTableDataAdapter._COLUMN_NAME_FULL_NAME;
column.ValueMember = CustomWychowawcaTableDataAdapter._COLUMN_NAME_ID;
dataGridView1.Columns.Add(column);
}
else
{
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
column.DataPropertyName = uczenDataTable.Columns[i].ColumnName;
column.HeaderText = uczenDataTable.Columns[i].ColumnName;
column.Name = uczenDataTable.Columns[i].ColumnName;
if (uczenDataTable.Columns[i].ColumnName.CompareTo(UczenTableDataAdapter._COLUMN_NAME_ID) == 0)
column.Visible = false;
dataGridView1.Columns.Add(column);
}
}
}
}
}
app.config
<?xml version="1.0" encoding="utf-8" ?>
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projects\DataAdapterDemo\Database\baza.accdb" />
– Dodane 27.07.2011 (Śr) 18:00 –
Wprowadziłem parę zmian w kodzie 