TatsuSheva Ответов: 1

Заполнение ячеек datagridview после проверки первой строки в C#


У меня есть DataGridView из 4-5 столбцов.
DataGridView доступен для редактирования.
Когда я ввожу значение в ссылочный столбец, то сразу же оно заполняет другие значения в других ячейках из базы данных mysql.
Но когда я перехожу к следующей строке и хочу добавить еще одно значение в ссылочную ячейку, а затем она заполнит другую, как и первая, она этого не сделала...
Это то, что я пытался....

private void TAB_Credit_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    if (TAB_Credit.Columns[e.ColumnIndex].Name == "Reference")
    {

         string cmdText = @"SELECT * FROM tb_ajout_articles 
                            WHERE Reference=@ref";
         MySqlDataAdapter sa = new MySqlDataAdapter(cmdText, MyConnexion);
         sa.SelectCommand.Parameters.Add("@ref", MySqlDbType.VarChar).Value =
         TAB_Credit.Rows[e.RowIndex].Cells["Reference"].Value.ToString();

         DataTable dt2 = new DataTable();
         sa.Fill(dt);

         if (dt.Rows.Count == 1)
         {
             TXT_Stock.Text = dt.Rows[0]["Quantite"].ToString();
             //double value = (double)TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value * (double)TAB_Credit.Rows[e.RowIndex].Cells["Prix_Unitaire"].Value;

             TAB_Credit.Rows[e.RowIndex].Cells["Designation"].Value = dt.Rows[0]["Designation"].ToString();
             TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value = dt.Rows[0]["Quantite"].ToString();
             TAB_Credit.Rows[e.RowIndex].Cells["Prix_Unitaire"].Value = dt.Rows[0]["Prix_Unitaire"].ToString();
             TAB_Credit["Total", e.RowIndex].Value = 
               Convert.ToString(
               Convert.ToInt32(TAB_Credit["Quantite", e.RowIndex].Value) * 
               Convert.ToInt32(TAB_Credit["Prix_Unitaire", e.RowIndex].Value));
               //TAB_Credit.Rows[e.RowIndex].Cells["Total"].Value = value.ToString();

             TXT_Brut.Text = TAB_Credit["Total", e.RowIndex].Value.ToString();

         }
     }
     if (TAB_Credit.CurrentCell.ColumnIndex == 6)
     {
         if (Convert.ToInt32(TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value) > Convert.ToInt32(TXT_Stock.Text))
         {
             MessageBox.Show("Stock finished");
             TAB_Credit.Rows[e.RowIndex].Cells["Quantite"].Value = dt.Rows[0]["Quantite"].ToString();

         }
         else
         {
             TAB_Credit["Total", e.RowIndex].Value = 
                   Convert.ToString(
                   Convert.ToInt32(TAB_Credit["Quantite", e.RowIndex].Value) * 
                   Convert.ToInt32(TAB_Credit["Prix_Unitaire", e.RowIndex].Value));
             TXT_Brut.Text = TAB_Credit["Total", e.RowIndex].Value.ToString();
         }
     }
 }

Мое приложение-это своего рода кассовый аппарат для магазина, поэтому в datagrid есть ссылка ,
это ссылка на продукт.
Когда пользователь вводит ссылку непосредственно, информация о продукте будет заполнена в других Столбцах, и пользователь может выбрать количество, которое он хочет, и он будет делать расчет.

Кроме того, я попытался поместить общую сумму счета в датагрид...

Ссылка | Продукт |Количество |Цена / Всего / Всего Счета
AB / AB|2 |1000 |2000 |5000
BC |BC|3 |1000 |3000

Именно это я и пытаюсь сделать... Чтобы сделать это, я попробовал этот код:

private void TAB_Credit_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    int sum = 0;

    for (int i = 0; i < TAB_Credit.Rows.Count; ++i)
    {

        sum += Convert.ToInt32(TAB_Credit.Rows[i].Cells["Total"].Value);
    }

    TAB_Credit.Rows[e.RowIndex].Cells["Total_Fact"].Value = sum.ToString();
}


Что я уже пробовал:

Я пытался, но у меня возникли проблемы....

1 Ответов

Рейтинг:
1

CHill60

Вы заполняете DataGridView только в том случае, если из базы данных возвращается ровно одна строка...

if (dt.Rows.Count == 1)< lang=
поэтому убедитесь, что у вас нет более одной возвращаемой строки - отладка поможет вам определить это.

У вас также есть только 6 столбцов на вашем столе, но вы смотрите на 7-й с помощью
if (TAB_Credit.CurrentCell.ColumnIndex == 6)
Помните, что коллекция столбцов основана на нуле - 1-й столбец равен 0,2-й столбец равен 1 и т. д.

Чтобы узнать, что происходит, вам придется отлаживать-поставить точку останова на линии
if (TAB_Credit.Columns[e.ColumnIndex].Name == "Reference")


Вы не сказали, что не так с вашим расчетом общей суммы, но я могу сказать вам, что вы игнорируете первую строку с циклом for
for (int i = 0; i < TAB_Credit.Rows.Count; ++i)
Вы предварительно увеличивающееся я скорее, чем пост-инкремент. Я считаю, что эта линия должна быть
for (int i = 0; i < TAB_Credit.Rows.Count; i++)
Тонкое, но важное различие. Опять же, вы можете подтвердить все это с помощью отладки. Кажется, я уже дал вам ссылку на статью о том, как это сделать.


TatsuSheva

да вы правы, мне пришлось удалить если (ДТ.Строк.Граф = = 1)....
Для второго вопроса сумма сделана, но если я нажму на другую строку, у меня будет эта ошибка : System.InvalidCastException и ошибка приходят к этой сумме += Convert.ToInt32(TAB_Credit.Строки[i].Клетки ["Всего"].Value); и это комментарий: {"невозможно привести объект DBNull в другие типы."}

CHill60

Нужно проверить, что значение в ячейке равно нулю, прежде чем пытаться преобразовать его в целое число. Я лично ненавижу функции Convert. Toxxx и предпочитаю int.Метод tryparse... примеры Метод tryparse[^]

TatsuSheva

Возможно ли, что он показывает только общую сумму не в каждой строке ! Я имею в виду если вы видите пример в моем случае первая строка в общем счете там 2000 а вторая строка 5000 но я хочу быть таким как я описал в вопросе

CHill60

Я не понимаю вашего вопроса. Но вы можете вычислить общую сумму, когда захотите, и поместить ее в сетку, где захотите. Событие DataGridView_Validated, вероятно, является лучшим местом для его размещения, поскольку оно означает, что пользователь закончил ввод данных и все введенные данные были проверены.