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ć.
 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 