Как мне закодировать кнопку редактирования в datagridview для редактирования в исходном текстовом поле ?
У меня возникли проблемы с тем, чтобы кнопка редактирования в datagridview работала правильно.Мне нужна кнопка редактирования, когда она выбрана, чтобы поместить текст обратно в исходное текстовое поле для редактирования, а затем нажать кнопку обновления, чтобы обновить эти данные. Я знаю, что делаю что-то не так, но не знаю, что именно. Если бы кто-нибудь мог посмотреть его и помочь мне понять, что я делаю неправильно, это было бы здорово!
Это мой код.:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace ProgressReports { public partial class ReportsForm : Form { public ReportsForm() { InitializeComponent(); } private void ReportsForm_Load(object sender, EventArgs e) { string connectionString = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\eliza\ReportsDatabase.mdf; Integrated Security = True; Connect Timeout = 30"; SqlConnection con = new SqlConnection(connectionString); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Database_tbl", con); DataSet ds = new DataSet(); da.Fill(ds, "Database_tbl"); ReportDataGrid.DataSource = ds.Tables["Database_tbl"].DefaultView; // TODO: This line of code loads data into the 'reportsDatabaseDataSet.Database_tbl' table. You can move, or remove it, as needed. this.database_tblTableAdapter.Fill(this.reportsDatabaseDataSet.Database_tbl); } private void Submit_Click(object sender, EventArgs e) { string connectionString = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\eliza\ReportsDatabase.mdf; Integrated Security = True; Connect Timeout = 30"; SqlConnection con = new SqlConnection(connectionString); con.Open(); SqlCommand cmd = new SqlCommand("INSERT INTO Database_tbl (EntryDate, ReportText) VALUES ('" + DateTime.Now + "','" + ReportText.Text + "')", con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Report Successfully Added"); ReportDataGrid.Update(); ReportText.Text = ""; }
//Вот тут-то у меня и возникла проблема
private void ReportDataGrid_CellContentClick(object sender, DataGridViewCellEventArgs e) { { if (ReportDataGrid.Columns[e.ColumnIndex].Name == "Edit") { int i = ReportDataGrid.CurrentCell.RowIndex; int j = ReportDataGrid.CurrentCell.ColumnIndex + 3; int x = ReportDataGrid.CurrentCell.ColumnIndex + 1; ReportText.Text = ReportDataGrid.Rows[i].Cells[j].Value.ToString(); lblRowID.Text = ReportDataGrid.Rows[i].Cells[x].Value.ToString(); btnUpdate.Visible = true; Submit.Visible = false; } } } private void btnUpdate_Click(object sender, EventArgs e) { string connectionString = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\eliza\ReportsDatabase.mdf; Integrated Security = True; Connect Timeout = 30"; SqlConnection con = new SqlConnection(connectionString); con.Open(); SqlCommand cmd = new SqlCommand("Update Database_tbl set ReportText = '" + ReportText.Text + "' Where EntryID = " + lblRowID.Text + "')", con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Report Successfully Updated"); ReportDataGrid.Update(); ReportText.Text = ""; } } }
Что я уже пробовал:
Это то, что я пробовал до сих пор
private void ReportDataGrid_CellContentClick(object sender, DataGridViewCellEventArgs e) { { if (ReportDataGrid.Columns[e.ColumnIndex].Name == "Edit") { int i = ReportDataGrid.CurrentCell.RowIndex; int j = ReportDataGrid.CurrentCell.ColumnIndex + 3; int x = ReportDataGrid.CurrentCell.ColumnIndex + 1; ReportText.Text = ReportDataGrid.Rows[i].Cells[j].Value.ToString(); lblRowID.Text = ReportDataGrid.Rows[i].Cells[x].Value.ToString(); btnUpdate.Visible = true; Submit.Visible = false; } } } private void btnUpdate_Click(object sender, EventArgs e) { string connectionString = @"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = C:\Users\eliza\ReportsDatabase.mdf; Integrated Security = True; Connect Timeout = 30"; SqlConnection con = new SqlConnection(connectionString); con.Open(); SqlCommand cmd = new SqlCommand("Update Database_tbl set ReportText = '" + ReportText.Text + "' Where EntryID = " + lblRowID.Text + "')", con); cmd.ExecuteNonQuery(); con.Close(); MessageBox.Show("Report Successfully Updated"); ReportDataGrid.Update(); ReportText.Text = ""; } } }
Garth J Lancaster
Howdy - вы на самом деле не говорите, в чем проблема, и я не на 100% ясно из вашего описания, как выглядит ваша форма (всегда трудно на этом форуме)
Итак, если я правильно понимаю,
а) у вас есть datagrid
б) у вас есть текстовое поле для "оригинального" текста
в) у вас есть кнопка обновления
И
d) Когда вы щелкаете строку в datagrid (я предполагаю/предполагаю, что она заполняется)
д) вы хотите, чтобы "текст" из строки/столбца был помещен в текстовое поле, где его можно редактировать
f) когда вы нажимаете кнопку Обновить, вы хотите обновить эту строку/столбец информацией из тестового поля
- да ?
Некоторые вещи, которые нужно проверить .. заполняются ли эти переменные/текстовое поле обновления
>>ReportText.Text = ReportDataGrid.Rows[i].Ячейки[j].значение.Метод toString();
>>lblRowID.Text = ReportDataGrid.Rows[i].Ячейки[x].значение.Метод toString();
Что же здесь означает "cmd"?
&ГТ;&ГТ; свойство sqlcommand cmd и = новая команда sqlcommand("Database_tbl обновить набор ReportText = '" + ReportText.Текст + "' где EntryID = " + lblRowID.Текст + "')", кон);
Кроме того ... это не очень хороший способ обработки SQL, пожалуйста, google для "параметризованного sql-запроса"
Наконец.. Взгляните на этот стиль
// В операторе using приобретите SqlConnection в качестве ресурса.
//
using (SqlConnection con = new SqlConnection(connectionString))
{
//
// Откройте SqlConnection.
//
против.Открыть();
//
// Делаем
}
Richard Deeming
SqlCommand cmd = new SqlCommand("Update Database_tbl set ReportText = '" + ReportText.Text + "' Where EntryID = " + lblRowID.Text + "')", con);
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
using (SqlCommand cmd = new SqlCommand("Update Database_tbl set ReportText = @ReportText Where EntryID = @EntryID", con)) { cmd.Parameters.AddWithValue("@ReportText", ReportText.Text); cmd.Parameters.AddWithValue("@EntryID", lblRowID.Text); cmd.ExecuteNonQuery(); }
Member 14802172
Поэтому я продолжаю получать одну и ту же ошибку каждый раз System.Data.SqlClient.SqlException: 'недопустимое имя столбца 'EntryID'.'
Это моя таблица в представлении дизайна:
Создайте таблицу [dbo].[Database_tbl] (
[EntryID] INT IDENTITY (1, 1) NOT NULL,
[EntryDate] SMALLDATETIME NOT NULL,
[ReportText] VARCHAR (255) NULL,
Кластеризованный первичный ключ ([EntryID] ASC)
);
Таким образом, EntryID на самом деле есть, но я получаю эту ошибку и не знаю, почему..
Richard Deeming
Убедитесь, что вы подключаетесь к правильному серверу и базе данных.
Попробуйте указать имя схемы в запросе:
Update dbo.Database_tbl set ReportText = @ReportText Where EntryID = @EntryID
Member 14802172
Поэтому я думаю, что исправил эту проблему, но теперь я получаю эту ошибку System.Data.SqlClient.SqlException: 'преобразование не удалось при преобразовании значения nvarchar '4/21/2020 12:26:00 PM' В тип данных int.'
Я не знаю, почему он пытается это преобразовать. Когда я редактирую выбранный столбец, он должен позволить мне обновить текст, нажать кнопку Обновить и заменить то, что изначально было в этом столбце, обновленным текстом и smalldatetime.
Простите, что доставляю вам столько хлопот. Я никогда раньше не работал ни с чем подобным, и мне приходится самому создавать весь этот проект с нуля. Я учусь на ходу. Спасибо за вашу помощь.
Richard Deeming
Если это все тот же запрос, то единственный int
колонка в нем будет такая EntryID
колонка.
Отладьте код и проверьте значение параметра lblRowID.Text
это передается параметру.
Member 14802172
Да, это тот же самый запрос, и EntryID-единственный int в столбце.
Вот что он говорит рядом с lblRowID.Текстовая Система.Окна.Формы.Этикетка, текст: 4/21/2020 12:26:00 PM}
Эта ошибка System.Data.SqlClient.SqlException: 'преобразование не удалось при преобразовании значения nvarchar '4/21/2020 12:26:00 PM' В тип данных int.'
все еще появляется рядом с cmd.Метод executenonquery();
Я не понимаю, почему он пытается обратиться.
Richard Deeming
Ну что ж, это будет проблемой - почему на этикетке "идентификатор строки" есть дата/время?
Вы пользуетесь lblRowID.Text
как то EventID
обновлять. Строка 4/21/2020 12:26:00 PM
не является действительным EventID
.
Member 14802172
Я все понял. Я не знаю, почему это заняло у меня так много времени. В CellContentClickevent у меня был этот lblRowID.Текст = ReportDataGrid.Строк[параметр rowindex].Ячейки[1].Значение.Метод toString();
У меня был неправильный индекс, он должен быть 0, а не 1. Я изменил его, теперь программа работает правильно.
Есть ли способ заставить программу обновиться после того, как я нажму кнопку обновления, чтобы показать ее в datagrid?
У меня есть ReportDataGrid.Refresh(); но он обновляется только после того, как я закрываю приложение и снова открываю его.
Еще раз спасибо за вашу помощь!
Richard Deeming
Вам нужно будет снова запустить код, который связывает сетку. В настоящее время он находится в ReportsForm_Load
обработчик событий. Вы захотите извлечь его в свой собственный метод, который вы можете вызвать из обработчика событий и всякий раз, когда вы хотите обновить сетку.