на данном этапе тебе стоит почитать вот это: http://slil.ru/29628776 там не многo, и можешь читать только то, что на данный момент интересует.
Доброго времени суток! Есть еще один вопрос, по данной теме. Вот код, который реализует удаление всего содержимого 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(); } Заранее спасибо.
ну так по поводу первого я тебе же уже ещё в самом начале ответил(#2). а по поводу второго в том же обработчике шлёшь sql команду SqlCommand("DELETE FROM edik_1 WHERE НаименованиеТовара='"+ this.dataGridView1[номер столбца с наименованием,e.RowIndex].Value.ToString()+"'"); как то так. писал на коленке, но, думаю, разберёшься.
По первому, я имел ввиду через конструкцию DELETE FROM.. но как правильно, я уже как только не пробовал..
1. Пробую удаление именно конкретной строки делать так, один хрен не получается: Скрин для наглядности: 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(); }
1. странно. у меня код работает. из грида удаляет нужную строку. про sql сказать не могу, т.к. нет бд для проверки. 2. копай в сторону dataGridView1.DataSource. указываешь его при загрузке. я не зря посоветовал тебе книжку выше. там показано как работать с адаптером и датасетом, которые отлично подходят для этого. вот похожий пример http://csharp.net-informations.com/dataadapter/datagridview-sqlserver.htm
ОК. Спасибо. А как можно сделать проверку на вводе? В смысле проверку на то, что я ввожу именно ссылку, а не какую-то "ываыау"? Догадываюсь, что через validation, но, а как именно? Вот пробовал: Code: Regex r = new Regex(@"(?<protocol>http|ftp|https|file)://(?<domain>[\w\.]+)(?<path>/.*)?"); но как сделать, чтобы проверка была в textbox?
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"); }
Получилось: 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");
вот если бы ты хоть словом обмолвился о кнопке "добавить", то всё было бы яснее. и откуда вдруг взялся текстбокс? я привёл пример выдачи ошибки при выходе из ячейки. по этому прошу более чётко описывать ситуацию, проблему и цель.
Приношу свои извинения. Да, я слегка не правильно описал ситуацию. Мой код, это модифицированный Ваш, реализует проверку по textbox-у. У меня в коде, множество строк(каждый раз при обращении к базе) повторяются: Code: SqlConnection connection = new SqlConnection("server=ROOT-ПК\\SQLEXPRESS; database=edik; uid=sa; pwd="); Как можно сделать, чтобы эта строка была всего один раз? Ну, чтобы не вбивать её каждый раз при новой SqlConnection?
что значит в коде, в одном классе или в нескольких? отличаются запросы друг от друга? если в одном классе и connection всегда одинаково, то достаточно объявить её глобально и испоьзовать переменную в любом месте класса. если же connection используется в нескольких классах, то можно создать отдельный класс, например Connector, со свойством Connection, которое можо вызывать в любом месте кода в виде Connector.Connection. Если соединения различны то используй параметры при содании обьектов new Conector(params). P.S. дружище, я настоятельно рекомендую почитать троелсена. подобные вопросы отпадут сами собой.
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. А можно как-то организовать подключение базы через файл, или вроде того?
правильно. юзай первый вариант. значит неправильно объявляешь. попробуй сделать его свойством. не совсем понял о чём ты.
Ну, просто мне говорили, что можно либо через глобальную переменную сделать подключение к базе, либо через файл отдельный. Ну, чтобы один раз за всю программу упомянуть строку и всё.. Правда может я что-то не то понял. В электронном варианте Троелсена смотрел: 1. Пример источника поставщика данных(файл *.config); Но, если честно что-то не разобрался.