1 октября 2012 г.

DataGridView и DataGridViewComboBox из другой таблицы

Продолжаю осваивать C# и изучать программирование вообще. Также продолжаю объединять своё уже бесчисленное количество маленьких, помогающих мне наработок. Объединять собрался с использование СУБД Firebird. Почему именно на ней? - не спрашивайте. Просто у меня есть книга по ней)) Да и когда-то приходилось с ней сталкиваться.

Ну а теперь по-порядку. Понадобилось мне в таблице разместить список предопределённых значений, содержащихся всё в той же моей БД. Струкруту БД приводить не буду, т.к. она находится в стадии разработки и планирования. Пока только учусь с ней работать и получать то, что мне нужно от неё. В общем, имеем 2 таблицы:
Поля APP_INSTALL:ACTION_ и ACTION_FILE:ACTION_ID каким-то образом должны быть связаны (не MasterDetail). Т.к. при создании новой записи пользователю должны предлагаться предопределённые действия с таблицы ACTION_FILE, а записываться в таблицу APP_INSTALL ACTION_ID.

Не найдя на просторах интернета готовые решения начал придумывать своё. Решение пришло само (озарение, прям) через 3 дня раздумий и переборов вариантов. В общем, вот. Чтобы и самому не забыть, и может кому ещё пригодится. На оригинальность не претендую совершенно. Интересно было бы увидеть и другие возможные варианты решений.
  FbConnection fbconn = new FbConnection();
  DataSet ds = new DataSet();
  FbDataAdapter da_app_inst;
  FbDataAdapter da_action_file;
  BindingSource bs_app_inst;
  BindingSource bs_action_file;
  string _AppPath = Application.StartupPath;

  private string SQLConnect(String DB)
  {
   FbConnectionStringBuilder cb = new FbConnectionStringBuilder();
   cb.Database = DB;
   cb.ServerType = FbServerType.Embedded;
   cb.ClientLibrary = _AppPath + @"\lib\fbembed.dll";
   cb.Charset = "UNICODE_FSS";
   cb.UserID = "SYSDBA";
   cb.Password = "masterkey";

   return cb.ToString();
  }

  private void frm_Applications_Load(object sender, EventArgs e)
  {
   dgv_app.AutoGenerateColumns = false;

   fbconn.ConnectionString = SQLConnect(_AppPath + @"\DB\MAIN.FDB");

   da_app_inst = new FbDataAdapter(@"SELECT
            *
           FROM
            app_install", fbconn);
   da_app_inst.Fill(ds, "app_install");

   da_action_file = new FbDataAdapter(@"SELECT
             *
            FROM
             action_file", fbconn);
   da_action_file.Fill(ds, "action_file");

   bs_app_inst = new BindingSource();
   bs_app_inst.DataSource = ds;
   bs_app_inst.DataMember = "app_install";
   dgv_app.DataSource = bs_app_inst;

   bs_action_file = new BindingSource();
   bs_action_file.DataSource = ds;
   bs_action_file.DataMember = "action_file";

   DataGridViewComboBoxColumn dgv_app_combo = new DataGridViewComboBoxColumn();
   DataGridViewTextBoxColumn dgv_app_from = new DataGridViewTextBoxColumn();
   dgv_app_from.DataPropertyName = "FROM_";
   dgv_app_from.HeaderText = "Откуда";
   dgv_app.Columns.Add(dgv_app_from);

   DataGridViewComboBoxColumn dgv_app_action = new DataGridViewComboBoxColumn();
   dgv_app_action.DataSource = bs_app_inst;
   dgv_app_action.DataPropertyName = "action_";
   dgv_app_action.HeaderText = "Действие";
   dgv_app.Columns.Add(dgv_app_action);

   DataGridViewTextBoxColumn dgv_app_to = new DataGridViewTextBoxColumn();
   dgv_app_to.DataPropertyName = "TO_";
   dgv_app_to.HeaderText = "Где";
   dgv_app.Columns.Add(dgv_app_to);

   DataGridViewComboBoxCell cbc = new DataGridViewComboBoxCell();
   dgv_app_action.CellTemplate = cbc;
   cbc.DataSource = ds.Tables["action_file"];
   cbc.ValueMember = "ACTION_ID";
   cbc.DisplayMember = "name";

   fbconn.Close();
  }
Расписывать сильно не буду, ибо, думаю, итак всё понятно. Старался обзывать контролы человекопонятным языком.

Комментариев нет:

Отправить комментарий

Уважаемый комментатор, пишите грамотно.
С благодарностью, автор блога.