Member 14802172 Ответов: 0

Как мне закодировать кнопку редактирования в 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 обработчик событий. Вы захотите извлечь его в свой собственный метод, который вы можете вызвать из обработчика событий и всякий раз, когда вы хотите обновить сетку.

0 Ответов