DataGrid

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by F&D, 24 Aug 2010.

  1. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    на данном этапе тебе стоит почитать вот это: http://slil.ru/29628776
    там не многo, и можешь читать только то, что на данный момент интересует.
     
  2. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Еще раз большое спасибо! Почитаем..
     
  3. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Доброго времени суток!
    Есть еще один вопрос, по данной теме.
    Вот код, который реализует удаление всего содержимого DataGrid, который сохраняется в БД.

    А как реализовать удаление конкретной строки(как на скриншоте, где в каждой строке свой DELETE)?

    Code:
    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
            {
    
                SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=");
                connection.Open();
                SqlCommand cmd = new SqlCommand("DELETE FROM edik_1");
                cmd.Connection = connection;
                cmd.ExecuteNonQuery();
                connection.Close();
                /*SqlCommand cmdDelete = new SqlCommand("DELETE FROM edik_1 WHERE НаименованиеТовара='"+ "tb_Delete.Text +"'";
                /*---Удаление содержимого всей таблицы---*/
                dataGridView1.Rows.Clear();
            }
    
    И как еще можно при удалении допустим, сразу сохранять изменения(при условии что есть код для сохранения)?

    Code:
    private void button2_Click(object sender, EventArgs e)
            {
                SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=");
                connection.Open();
                     SqlCommand command = new SqlCommand (@"INSERT INTO edik_1 (Feed, Nameoffeed, DeleteAll) "+
                         "VALUES  (@pFeed, @pNameoffeed, @pDeleteAll)");
                   
                    command.Connection = connection;
                    command.Parameters.Add(new SqlParameter("@pFeed", textBox1.Text));
                    command.Parameters.Add(new SqlParameter("@pNameoffeed", textBox2.Text));
                    command.Parameters.Add(new SqlParameter("@pDeleteAll", "Delete"));
    
                
                    command.ExecuteNonQuery();
                    connection.Close();
                }
    
    Заранее спасибо.
     
    #23 F&D, 6 Sep 2010
    Last edited: 6 Sep 2010
  4. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    удаление строки и сохранение изменений где? в гриде или в бд?
     
    1 person likes this.
  5. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    И в гриде и в БД. Имею ввиду, чтобы в гриде нажал - DELETE, удалилось и из грида и из БД
     
    #25 F&D, 7 Sep 2010
    Last edited: 7 Sep 2010
  6. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    ну так по поводу первого я тебе же уже ещё в самом начале ответил(#2). а по поводу второго в том же обработчике шлёшь sql команду SqlCommand("DELETE FROM edik_1 WHERE НаименованиеТовара='"+ this.dataGridView1[номер столбца с наименованием,e.RowIndex].Value.ToString()+"'");
    как то так. писал на коленке, но, думаю, разберёшься.
     
  7. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    По первому, я имел ввиду через конструкцию DELETE FROM.. но как правильно, я уже как только не пробовал.. :(
     
  8. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    1.
    Пробую удаление именно конкретной строки делать так, один хрен не получается:

    Скрин для наглядности: :)
    [​IMG]

    Code:
    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                /*---Удаление строки---*/
                if (e.RowIndex != -1)
                {
                    if (e.ColumnIndex == 2) dataGridView1.Rows.RemoveAt(e.RowIndex);
                    else if (e.ColumnIndex == 0)
                    {
                        
                        /*---Парсинг---*/
                        XmlTextReader reader = new XmlTextReader((sender as DataGridView)[e.ColumnIndex, e.RowIndex].Value.ToString());
                        while (reader.Read())
                        {
                            switch (reader.Name)
                            {
                                case "title":
                                    listBox1.Items.Add(reader.ReadString());
                                    break;
                                case "link":
                                    listBox1.Items.Add(reader.ReadString());
                                    break;
                                case "pubDate":
                                    listBox1.Items.Add(reader.ReadString());
                                    listBox1.Items.Add("\n");
                                    break;
                            }
                        }
                                    
                    }
                    
                }
    
    /*---Удаление строки---*/
                SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=");
                connection.Open();
                SqlCommand command = new SqlCommand("DELETE FROM edik_1 WHERE DeleteAll = @Delete", connection);
                command.Parameters.Add(new SqlParameter("@Delete", 3));
                //command.ExecuteNonQuery();
                connection.Close();
            }
    
    

    2.
    Как можно реализовать отображение содержимого таблицы базы данных в таблице DataGrid, сразу при запуске. Т.е., что я имею ввиду, к примеру запустили прогу - добавили в DataGrid допустим строку "111", сохранили в БД. И закрыли прогу.
    Так, вот как сделать, чтобы при открытии в следующий раз, строка "111" у нас сразу отображалась с DataGrid?

    Опять же, пробую так, но работает не корректно, отображается, только первый столбец и последний:
    Code:
    SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=123321");
                try
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand("SELECT * FROM edik_1", connection);
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                        dataGridView1.Rows.Add(reader["feed"]);
                    reader.Close();
                               
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    connection.Close();
                }
    
     
    #28 F&D, 9 Sep 2010
    Last edited: 9 Sep 2010
  9. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    1. странно. у меня код работает. из грида удаляет нужную строку. про sql сказать не могу, т.к. нет бд для проверки.

    2. копай в сторону dataGridView1.DataSource. указываешь его при загрузке. я не зря посоветовал тебе книжку выше. там показано как работать с адаптером и датасетом, которые отлично подходят для этого. вот похожий пример http://csharp.net-informations.com/dataadapter/datagridview-sqlserver.htm
     
  10. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    1. Из грида и у меня удаляет, а вот из sql не хочет :(

    2. Спасибо, гляну, попробую.
     
  11. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    первый пункт последует из второго
     
  12. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    ОК. Спасибо.


    А как можно сделать проверку на вводе? В смысле проверку на то, что я ввожу именно ссылку, а не какую-то "ываыау"?

    Догадываюсь, что через validation, но, а как именно?

    Вот пробовал:
    Code:
     Regex r = new Regex(@"(?<protocol>http|ftp|https|file)://(?<domain>[\w\.]+)(?<path>/.*)?");
    но как сделать, чтобы проверка была в textbox?
     
    #32 F&D, 14 Sep 2010
    Last edited: 14 Sep 2010
  13. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    Code:
     private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
                Regex r = new Regex(@"(?<protocol>http|ftp|https|file)://(?<domain>[\w\.]+)(?<path>/.*)?");
                if (!r.IsMatch((sender as DataGridView)[e.ColumnIndex, e.RowIndex].Value.ToString()))
                {
                    Console.WriteLine("not a url");
                }
                else
                    Console.WriteLine("ok");
            }
     
  14. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Получилось:
    Code:
    Regex r = new Regex(@"(?<protocol>http|ftp|https|file)://(?<domain>[\w\.]+)(?<path>/.*)?");
    if (!r.IsMatch(textBox1.Text))
    {
    MessageBox.Show("not a url");
    }
    else
    MessageBox.Show("ok");
    
     
  15. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    вот если бы ты хоть словом обмолвился о кнопке "добавить", то всё было бы яснее. и откуда вдруг взялся текстбокс? я привёл пример выдачи ошибки при выходе из ячейки.

    по этому прошу более чётко описывать ситуацию, проблему и цель.
     
    #35 BrainDeaD, 15 Sep 2010
    Last edited: 15 Sep 2010
  16. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Приношу свои извинения. Да, я слегка не правильно описал ситуацию.
    Мой код, это модифицированный Ваш, реализует проверку по textbox-у.


    У меня в коде, множество строк(каждый раз при обращении к базе) повторяются:

    Code:
    SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd=");
    
    Как можно сделать, чтобы эта строка была всего один раз? Ну, чтобы не вбивать её каждый раз при новой SqlConnection?
     
  17. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    что значит в коде, в одном классе или в нескольких? отличаются запросы друг от друга?

    если в одном классе и connection всегда одинаково, то достаточно объявить её глобально и испоьзовать переменную в любом месте класса.

    если же connection используется в нескольких классах, то можно создать отдельный класс, например Connector, со свойством Connection, которое можо вызывать в любом месте кода в виде Connector.Connection. Если соединения различны то используй параметры при содании обьектов new Conector(params).

    P.S. дружище, я настоятельно рекомендую почитать троелсена. подобные вопросы отпадут сами собой.
     
    2 people like this.
  18. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Code:
    string strConn = "server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd="
    
    и:
    SqlConnection connection = new SqlConnection(strConn)
    
    или:
    SqlConnection connection = new SqlConnection()
    connection.ConnectionString = strConn
    
    А вот так правильно, или нужно что-то добавить, или может как-то проще сделать?
    Просто если объявляю глобально, все равно не работает.. :(


    P.S. За Троелсена спасибо, скачал электронную версию, но думаю бумажная будет лучше.
    P.S.2. А можно как-то организовать подключение базы через файл, или вроде того?
     
  19. BrainDeaD

    BrainDeaD Elder - Старейшина

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    правильно. юзай первый вариант.
    значит неправильно объявляешь. попробуй сделать его свойством.
    не совсем понял о чём ты.
     
  20. F&D

    F&D Member

    Joined:
    6 Nov 2008
    Messages:
    341
    Likes Received:
    8
    Reputations:
    5
    Ну, просто мне говорили, что можно либо через глобальную переменную сделать подключение к базе, либо через файл отдельный. Ну, чтобы один раз за всю программу упомянуть строку и всё..
    Правда может я что-то не то понял.

    В электронном варианте Троелсена смотрел:

    1. Пример источника поставщика данных(файл *.config);
    Но, если честно что-то не разобрался.
     
    #40 F&D, 20 Sep 2010
    Last edited: 20 Sep 2010