Проблема с форматом в C# с DataGridView и TextBox - PullRequest
2 голосов
/ 21 апреля 2020

У меня проблема с форматом в C#. У меня есть DataGridView и TextBox. В этом сетевом представлении есть столбец: единая цена (формат int). Я хочу суммировать все элементы столбца одной цены и вставить результат в это текстовое поле, но Visual Studio дает мне проблему с форматом ввода строки («Формат строки ввода неверен»). это код, который я использовал:

int TOT = 0;
                for (int i = 0; i < dataGridView3.Rows.Count; i++)
                {
                    TOT = TOT + Convert.ToInt32(dataGridView3.Rows[i].Cells[6].ToString());
                }
                textBoxTot.Text = Convert.ToString(TOT);

Можете ли вы помочь мне с этой ошибкой?

ОБНОВЛЕНИЕ: Я думаю, что проблема сейчас другая. Я не могу найти методы библиотеки MySql .Data.MySqlClient, чтобы она могла дать мне результат запроса.

MySqlCommand command = new MySqlCommand();
            String sumQuery = "SELECT SUM(`prezzo`) FROM `fatturetemp`";
            command.CommandText = sumQuery;
            command.Connection = conn.getConnection();
            command.Parameters.Add("@prezzo", MySqlDbType.Int32).Value = costo;
            conn.openConnection();
            conn.closeConnection();

Как команда, которая дает мне результат sumQuery. Если я найду эту команду, я смогу взять результат запроса и вставить в текстовое поле

Ответы [ 4 ]

0 голосов
/ 22 апреля 2020

Вы можете вызвать метод ExecuteScalar. Возвращает первый столбец первой строки в наборе результатов, возвращенном запросом.

Вот простая демонстрация.

using (MySqlConnection conn = new MySqlConnection("string"))
{
    string strSQL = "sql string";
    MySqlCommand cmd = new MySqlCommand(strSQL, conn);
    try
    {
        conn.Open();
        int sum = (int)cmd.ExecuteScalar();
        Console.WriteLine($"The sum is {sum}");
    }
    catch { }
}
0 голосов
/ 21 апреля 2020

Если ваше представление данных отображает таблицу данных (т. Е. Ваши данные хранятся в таблице данных), вы можете добавить DataColumn в таблицу данных, свойство .Expression которой установлено в строку "SUM([Price])", где Цена имя вашего столбца с цифрой c, содержащим данные о цене.

Теперь каждая строка в таблице будет иметь сумму цен (одно и то же значение снова и снова), поэтому, если вы хотите привязать свой текстовый блок данных к этому новому столбцу, он всегда будет отображать сумму независимо от того, какая строка является текущей строкой (потому что все строки имеют одинаковое значение). Он также будет автоматически обновляться без необходимости что-либо делать!

И если вы не используете привязку данных к данным, я рекомендую вам это сделать, потому что это представляет собой хорошую MVC практику хранения ваших данных в одной вещи (DataTable) и показывая его в другой (DataGridView) и разделяя эти проблемы отдельно

В качестве быстрого примера это будет выглядеть примерно так:

        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Price", typeof(int));
        dt.Columns.Add("CalculatedTotal", typeof(int)).Expression = "SUM([Price])";
        dt.Rows.Add("Apples", 100);
        dt.Rows.Add("Oranges", 200);

        BindingSource bs = new BindingSource();
        bs.DataSource = dt;

        WhateverDataGridView.DataSource = bs;
        totalTextBox.DataBindings.Add(new Binding("Text", bs, "CalculatedTotal", true));

Здесь мы имеем модель данных (DataTable), где мы храним наши данные. Он имеет несколько вещей, которые мы можем установить напрямую, и третий столбец, который рассчитывает на основе существующих цен во всей таблице. Если вы посмотрите на это в сетке данных (при условии, что у вас включен автогенератор столбцов), вы увидите, что в обеих строках есть 300 для CalculatedTotal, но они имеют отдельные суммы для цены. Существует устройство, называемое BindingSource, которое находится между датируемым элементом и элементами управления пользовательского интерфейса; вам не нужно иметь его, но это облегчает определенные вещи, касающиеся обновления элементов управления при изменении данных, и поддерживает концепцию «текущего» - по сути независимо от текущей строки, которую вы просматриваете в сетке данных; все это помогает избежать необходимости спрашивать DGV о чем-либо - мы просто позволяем пользователю вводить данные в DGV, и он показывает данные из таблицы данных. Все наши сделки могут быть напрямую связаны с данными - если вы напишите кнопку l oop через таблицу и удвоите все цены, элементы управления в пользовательском интерфейсе просто отразят изменение автоматически. Текстовое поле подключается к столбцу CalculatedValue через привязку данных; независимо от текущей строки, текстовое поле покажет CalculatedValue. Поскольку столбец CalculatedValue имеет одинаковое значение в каждой строке, и все они всегда обновляются при изменении цены, итоговое текстовое поле всегда будет отображать итоговое значение. Добавьте другое текстовое поле, связанное с именем, чтобы увидеть, что я имею в виду; когда вы щелкаете по сетке и выбираете разные строки, которые будут строкой «Текущий», Имя изменится, а итоговое значение - нет. По правде говоря, он действительно меняется так же, как и Name, просто потому, что фактическое значение цифры 1024 * одинаково для каждой строки, содержимое текстового поля выглядит как будто оно не изменяется

0 голосов
/ 22 апреля 2020

ОБНОВЛЕНИЕ: Я думаю, что проблема сейчас другая. Я не могу найти методы библиотеки MySql .Data.MySqlClient, чтобы она могла дать мне результат запроса.

public string sommaFattura(String costo)
        {
    MySqlCommand command = new MySqlCommand();
                String sumQuery = "SELECT SUM(`prezzo`) FROM `fatturetemp`";
                command.CommandText = sumQuery;
                command.Connection = conn.getConnection();
                command.Parameters.Add("@prezzo", MySqlDbType.Int32).Value = costo;
                conn.openConnection();
                conn.closeConnection();
}

Как команда, которая дает мне результат sumQuery. Если я найду эту команду, я смогу взять результат запроса и вставить в текстовое поле

0 голосов
/ 21 апреля 2020

Странно, что вы сначала конвертируете в строку, а затем в int.

int TOT = 0;
for (int i = 0; i < dataGridView3.Rows.Count; i++)
{
    if (!dataGridView3.Rows[i].IsNewRow &&
  int.TryParse(dataGridView3.Rows[i].Cells[6].Value.ToString(), out int v))
       TOT += v;
}
textBoxTot.Text = TOT.ToString();

РЕДАКТИРОВАТЬ: Отредактировано для вашего обновленного вопроса. Вы не должны задавать вопрос внутри вопроса купить в любом случае:

string sumQuery = "SELECT SUM(`prezzo`) FROM `fatturetemp`";
decimal total = 0M;
using (MySqlConnection cn = new MySqlConnection(" your connection string here "))
using (MySqlCommand cmd = new MySqlCommand(sumQuery, cn))
{
  cn.Open();
  total = Convert.ToDecimal(cmd.ExecuteScalar());
  cn.Close();
}
Console.WriteLine(total);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...