Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Как работает GUI с БД


Автор: Fazil6 27.8.2007, 11:31
Здравствуйте.

Подключаюсь в БД Oracle. 
Написал класс Oracle и в нем
Код


public bool Connect(DB_parameters p)
    {
        Close();

        OracleConnectionStringBuilder builder =
                    new OracleConnectionStringBuilder();
        
        builder["Load Balance Timeout"] = Consts.ORACLE_TIMEOUT;
        builder["Server"]               = p.db;
        builder["user id"]              = p.user;
        builder["password"]             = p.pasw;
        builder["Unicode"]              = Consts.UNICODE_USE;
          
        // connection - static OracleConnection в этом классе
        connection = new OracleConnection(builder.ConnectionString);
   
        try
        {
            connection.Open();
            ds = new DataSet("TestPlan");  // ds - static  DataSet в этом классе
            connected = true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            connected = false;
        }

        return Connected();
    }

запросы к БД делаются такой функцией
Код

public static bool QueryData(string sql, string ds_tab)  // метод для запроса Select
    {
        if (!Connected())
        {
            ErrorMessage = Consts.ORACLE_NOT_CONNECTED;
            return false;
        }
        
        try
        {
            OracleCommand command = new OracleCommand(sql, connection);
            OracleDataAdapter da = new OracleDataAdapter(command);
            da.Fill(ds, ds_tab);
        }
        catch (Exception e) { ErrorMessage = e.Message; return false; }

        
         return true;
        
    }

при этом всем я могу получить вот так DataSource
Код

public static BindingSource GetBindingSource(string ds_tab)
    {
        return new BindingSource(ds,ds_tab);
    }


потом на главной форме я вывожу полученные данные в грид
Код

private void connectToolStripMenuItem_Click(object sender, EventArgs e)
        {
 //bla - bla к делу не относится
           if(!o.Connect(db_sel.GetSelectedData())) MessageBox.Show("Неправильные значения строки подключения");

            if(!Oracle.QueryData(Consts.QUERY_TEST_SQL, Consts.APP_TEST_TABLE))
            {
                MessageBox.Show(Oracle.GetErrorStr());
                return;
            }
          
            testView1.DataSource = Oracle.GetBindingSource(Consts.APP_TEST_TABLE); // получил и все отобразилось
        }

дальше никак не могу втыркнуть как обрабатывать перемещение по этому моему гриду ??? т.е. как сделать обработчик(вообще какое событие какого класа это должно быть) когда пользователь в гриде переходит по записям?

ЗЫ. Я человек новый в дотнет и любая конструктивная критика приведенного кода приветствуется. Вполне возможно, что я вообще, как грится, через ж@nу пытаюсь сделать...

Автор: ivashkanet 27.8.2007, 13:20
Fazil6, во первых это вопрос по WinForms, a не по базам данных (судя по всему, ты данные получаешь, хоть и немного странным образом). 

Дальше, если у тебя DataGridView контрол (не могу точно сказать что такое testView1), то у него есть событие CurrentCellChanged которое тебе поможет:
Код

        private void dataGridView1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dataGridView1.CurrentCell != null)
            {
                int currentRowIndex = dataGridView1.CurrentCell.RowIndex;
                int currentColumnIndex = dataGridView1.CurrentCell.ColumnIndex;

                label1.Text = string.Format("Current cell is ({0}, {1})", currentRowIndex, currentColumnIndex);    
            }
        }


P.S. 
Цитата(Fazil6 @  27.8.2007,  11:31 Найти цитируемый пост)
Я человек новый в дотнет и любая конструктивная критика приведенного кода приветствуется. Вполне возможно, что я вообще, как грится, через ж@nу пытаюсь сделать...

Ну немного нетривиально, так сказать smile
Подключение к БД: в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.
Я делаю так:
Код


            OracleConnection connection = getConnection();
            OracleCommand command = connection.CreateCommand();
            command.Connection = connection;
            command.CommandText = queryString;

            try
            {
                connection.Open();

                OracleDataReader reader = command.ExecuteReader();
                 ...
                 ...
            }
            finally
            {
                connection.Close();
            }


В данном случае можно обойтись и без БД. 
Для тестов я наваял следующий код:
Код

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable table = new DataTable("My table");
            table.Columns.Add("ID");
            table.Columns.Add("Value");

            DataRow row ;

            for (int i = 0; i < 100; i++)
            {
             row = table.NewRow();
             row[0] = i;
             row[1] = "Value of row N " + i.ToString();
             table.Rows.Add(row);
            }


            dataGridView1.DataSource = table;
        }

P.P.S. Удачи в освоении .Net ;-)

Добавлено через 1 минуту и 15 секунд
Ещё можно ознакомиться http://forum.vingrad.ru/index.php?show_type=forum&showtopic=147165&hl=ivashkanet (правда ни к чему толковому мы там так и не пришли smile )

Автор: Fazil6 27.8.2007, 22:49
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Fazil6, во первых это вопрос по WinForms, a не по базам данных (судя по всему, ты данные получаешь, хоть и немного странным образом). 

а в чем собственно странность? 
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Дальше, если у тебя DataGridView контрол (не могу точно сказать что такое testView1), то у него есть событие CurrentCellChanged которое тебе поможет:

действительно это DataGridView и CurrentCellChanged я видел, но как я понял мне придется в его обработчике отслеживать сменилась текущая запись или нет ибо обрабатывать нужно именно переход по записям, и мне думалось, что логично иметь некое событие для смены текущей записи.
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
Подключение к БД: в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.

непонял, к чему это ?

Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
В данном случае можно обойтись и без БД. Для тестов я наваял следующий код:

тут тоже не понял : в каком "данном случае" и "Для тестов" чего?


Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
P.P.S. Удачи в освоении .Net ;-)

спасибо конечно...

Автор: Fazil6 28.8.2007, 01:19
вобщем пришел к такому варианту
Код

private void testView1_CurrentCellChanged(object sender, EventArgs e)
        {
            if (current_row == testView1.CurrentRow)  return;

            current_row = testView1.CurrentRow;

          ...
        }

Автор: ivashkanet 28.8.2007, 08:58
Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
а в чем собственно странность? 

Один метод обращения к базе (см. мой пример) ты растянул на 3, с локальными переменными...
Причём коннекшин к базе у тя всегда установлен хотя это делать не обязательно (и даже расточительно) так как 
Цитата(ivashkanet @  27.8.2007,  13:20 Найти цитируемый пост)
в .Net есть свой внутренний пул коннекшинов, так что не обязательно его держать постоянно открытым.

Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
в каком "данном случае"

Данный случай -- задача заявленная в первом посте: 
Цитата(Fazil6 @  27.8.2007,  11:31 Найти цитируемый пост)
как обрабатывать перемещение по этому моему гриду
 Которая никоем образом не относится к базам данных.
Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
"Для тестов" чего?

Для тестов твоей задачи (я и знать не знал, как называется нужное тебе событие).
Цитата(Fazil6 @  28.8.2007,  01:19 Найти цитируемый пост)
вобщем пришел к такому варианту

Именно такой код я себе и представлял.
Цитата(Fazil6 @  27.8.2007,  22:49 Найти цитируемый пост)
CurrentCellChanged я видел, но как я понял мне придется в его обработчике отслеживать сменилась текущая запись или нет ибо обрабатывать нужно именно переход по записям, и мне думалось, что логично иметь некое событие для смены текущей записи.

Зачем иметь специализированное событие, если есть более общее, отлично точащееся под узкую задачу? (риторический вопрос).

Автор: deviLoper 29.8.2007, 17:51
Если я праильно понял вопрос, то есть еще такой вариант:
Код

            this.BindingContext[table].PositionChanged += new EventHandler(Position_Changed);

И дальше обрабатываеш событие Position_Changed. Это и есть событие перехода между записями. BindingContext[table] это экземпляр класса BindingManagerBase, который сообственно и отвечает за связь между DataGridView и DataSet

Автор: Fazil6 30.8.2007, 11:43
учтем

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)