Мне нужно иметь возможность удалить выбранную строку в моем datagridview
Я создал код, который позволяет пользователю войти в систему (все еще работает), а затем добавить записи пациентов в базу данных, которая отображается в datagridview. Мне нужна кнопка delete, чтобы удалить выбранную строку в datagridiew и сохранить ее в базе данных. Прямо сейчас мой код работает, но он фактически ничего не удаляет.
Вот мой код:
использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
использование System.Data;
использование системы.Рисование;
использование System.Linq;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;
использование системы.Окна.Формы;
используя системы.Данных.Поставщики sqlclient;
отчеты о пространстве имен
{
public partial class ReportsForm : форма
{
общественные ReportsForm()
{
метод InitializeComponent();
}
частная ReportsForm_Load недействительным(объект отправителя, EventArgs в электронной)
{
строковый параметр connectionString = @"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\RecordsDatabase.МДФ;Комплексная безопасность=true;в подключения таймаут=30";
SqlConnection con = new SqlConnection(connectionString);
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Database_tbl", con);
DataSet ds = новый набор данных();
да.Заполнить(ДС, "Database_tbl");
RecordsdataGridView.DataSource = ds.Tables["Database_tbl"].DefaultView;
// TODO: эта строка кода загружает данные в таблицу recordsDatabaseDataSet.Database_tbl. Вы можете переместить или удалить его, если это необходимо.
это.database_tblTableAdapter.Заполнить(в этом.recordsDatabaseDataSet.Database_tbl);
}
private void DisplayData()
{
строковый параметр connectionString = @"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\RecordsDatabase.МДФ;Комплексная безопасность=true;в подключения таймаут=30";
SqlConnection con = new SqlConnection(connectionString);
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Database_tbl", con);
DataSet ds = новый набор данных();
да.Заполнить(ДС, "Database_tbl");
RecordsdataGridView.DataSource = ds.Tables["Database_tbl"].DefaultView;
}
частная btnSubmit_Click недействительным(объект отправителя, EventArgs в электронной)
{
строковый параметр connectionString = @"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\RecordsDatabase.МДФ;Комплексная безопасность=true;в подключения таймаут=30";
SqlConnection con = new SqlConnection(connectionString);
против.Открыть();
SqlCommand cmd = new SqlCommand("вставить в Database_tbl (EntryDate, ReportText) значения ('" + DateTime.Теперь + "', '" + txtReports.Текст + "')", кон);
УМК.Метод executenonquery();
против.Закрывать();
Ящик для сообщений.Показать("Отчет Успешно Добавлен");
DisplayData();
txtReports.Текст = "";
}
частная RecordsdataGridView_CellContentClick недействительным(объект отправителя, DataGridViewCellEventArgs е)
{
if (RecordsdataGridView.Колонки[e.ColumnIndex].Name == "Редактировать")
{
инт параметр rowindex = RecordsdataGridView.CurrentCell.Параметр rowindex;
txtReports.Текст = RecordsdataGridView.Строк[параметр rowindex].Ячейки[2].Значение.Метод toString();
лблровид.Текст = RecordsdataGridView.Строк[параметр rowindex].Ячейки[0].Значение.Метод toString();
btnUpdate.Видимое = истинное;
btnSubmit.Видна = ложь;
}
if (RecordsdataGridView.Колонки[e.ColumnIndex].Name == "Отмена")
{
txtReports.Текст = "";
}
else if (RecordsdataGridView.Колонки[e.ColumnIndex].Name == "Удалить")
{
строковый параметр connectionString = @"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\RecordsDatabase.МДФ;Комплексная безопасность=true;в подключения таймаут=30";
Результат отображается в виде диалогового окна = окно MessageBox.Show("вы уверены, что хотите удалить этот отчет о пациенте?", "конформация", MessageBoxButtons.Да нет);
if (result == DialogResult.Yes)
{
SqlConnection con = new SqlConnection(connectionString);
Команда sqlcommand cmd и = новая команда sqlcommand("удалить из Database_tbl где код записи = @желаемых результатов ", - кон -);
против.Открыть();
cmd.параметры.AddWithValue("@EntryID", lblRowID.Text);
УМК.Метод executenonquery();
против.Закрывать();
DisplayData();
}
иначе если (результат == DialogResult.No)
{
вернуть;
}
}
}
частная btnUpdate_Click недействительным(объект отправителя, EventArgs в электронной)
{
строковый параметр connectionString = @"источник данных=(на localdb)\MSSQLLocalDB;ключевое слово attachdbfilename=С:\Пользователи\RecordsDatabase.МДФ;Комплексная безопасность=true;в подключения таймаут=30";
SqlConnection con = new SqlConnection(connectionString);
против.Открыть();
используя (команда sqlcommand cmd и = новая команда sqlcommand("Database_tbl обновить набор ReportText = @ReportText где код записи = @желаемых результатов", - кон -))
{
cmd.параметры.AddWithValue ("@ReportText", txtReports.Text);
cmd.параметры.AddWithValue("@EntryID", lblRowID.Text);
УМК.Метод executenonquery();
}
против.Закрывать();
Ящик для сообщений.Показать("Отчет Успешно Обновлен");
DisplayData();
txtReports.Текст = "";
}
частная btnExit_Click недействительным(объект отправителя, EventArgs в электронной)
{
Приложение.Выход();
}
}
}
Что я уже пробовал:
Я попробовал это, что он действительно работает, и во время работы аппликатора он удалит выбранную строку. Однако он не сохраняет его в базе данных, поэтому при повторном запуске приложения выбранная строка, которая была удалена, возвращается обратно.
Код:
Результат отображается в виде диалогового окна = окно MessageBox.Show("вы уверены, что хотите удалить этот отчет о пациенте?", "конформация", MessageBoxButtons.Да нет);
if (result == DialogResult.Yes)
{
инт параметр rowindex = RecordsdataGridView.CurrentCell.Параметр rowindex;
RecordsdataGridView.Строк.RemoveAt(параметр rowindex);
иначе если (результат == DialogResult.No)
{
вернуть;
}
Gerry Schmitz
Ваша "сетка" не знает никакой базы данных. Вы извлекли некоторые данные и загрузили сетку; 2 являются независимыми. Поскольку там есть какой-то код SQL "DELETE", я предполагаю, что вы скопировали, но не понимаете, что вы скопировали. Много дублированного кода.
Member 14802172
Я не совсем понимаю, что вы подразумеваете под моей "сеткой", не имеющей никаких знаний о какой-либо базе данных. Я могу вводить информацию в свой код и редактировать его. У меня просто возникли проблемы с определением кнопки удаления. Я создал это приложение с нуля. Мне пришлось учить себя большей части того, что вы видите, просматривая видео и читая формы. Я все еще очень новичок в этом деле. Поэтому я и задал этот вопрос в первую очередь. Если вы лучше знаете, что я должен делать, пожалуйста, объясните, чтобы я мог учиться. Это не самый красивый код, который я знаю, но я делаю все, что могу. Спасибо.
Sinisa Hajnal
Вы не должны объединяться в операторе INSERT, вы используете параметры в других запросах.
Вы пробовали а) установить точку останова и посмотреть, есть ли lblID.Текст содержит значение b) try..catch around execute non-query, чтобы увидеть, если что-то ломается (на самом деле это должно быть все вокруг кода c) каково возвращаемое значение ExecuteNonQuery (т. е. существует ли ID и он пытается удалить правильную запись)
Наконец, вы должны вызвать close и dispose в блоке finally, чтобы избежать утечек памяти при исключениях.
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
Особенно тревожно, учитывая упоминание о "записях пациентов". Если это не игрушечное приложение для школьного проекта, будьте готовы столкнуться с огромным штрафом за ненадлежащую защиту ваших данных!
Jassom
Убедитесь, что вы используете правильный параметр идентификатора пациента, который вы собираетесь удалить, является ли этот параметр (lblRowID.Text) правильным идентификатором для записи, которую вы собираетесь удалить.