Выполнение расчета для отфильтрованного DataGridView - PullRequest
0 голосов
/ 17 января 2012

У меня есть Datagridview, который я заполняю из набора данных, созданного из файла XML. Эта часть работает, и я могу получить все содержимое набора данных для отображения в сетке данных. У меня есть добавленная функциональность для фильтрации просмотра данных на основе даты и проданного флага. Это также работает нормально при обновлении таблицы данных при циклическом переключении дат. Однако мне нужно сделать некоторые расчеты по «фильтрованному» представлению данных. Эти расчеты необходимы для конвертации различных валют в фунты стерлингов. Поэтому после некоторого исследования наилучшего способа сделать это я решил пройтись по видимой сетке данных и проверить каждую из видимых. Это код, который я использую. К сожалению, когда он запускается, все тесты завершаются неудачно, и он пытается выполнить предложение else, которое затем завершается неудачей с исключением «Входная строка не в правильном формате». Тем не менее, я не думаю, что это проблема, так как я смотрю на цены и валюту, и они «не существуют в текущем контексте» ... теперь я застрял и был бы признателен за некоторую помощь. Возможно, я иду по этому неправильному пути ...

Спасибо

Harry

for (int i = 1; i < dataGridView1.Rows.Count; i++)
            {
                if (dataGridView1["currency", i].ToString() == "USD")
                {
                    myCommission += double.Parse(dataGridView1["commission", i].ToString()) * (double.Parse(dataGridView1["price", i].ToString()) * UStoGB);
                }
                else if (dataGridView1["currency", i].ToString() == "EURO")
                {
                    myCommission += double.Parse(dataGridView1["commission", i].ToString()) * (double.Parse(dataGridView1["price", i].ToString()) * EUtoGB);
                }
                else
                {
                    myCommission += double.Parse(dataGridView1["commission", i].ToString()) * double.Parse(dataGridView1["price", i].ToString());
                }

            }

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Мне удалось заставить это работать, используя

    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (dataGridView1.Rows[i].Cells["currency"].FormattedValue.ToString() == "USD")
        {
            string tempval = dataGridView1.Rows[i].Cells["commission"].ToString();
            myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString()) * UStoGB);
        }
        else if (dataGridView1.Rows[i].Cells["currency"].FormattedValue.ToString() == "EURO")
        {
            myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString()) * EUtoGB);
        }
        else
        {
            myCommission += double.Parse(dataGridView1.Rows[i].Cells["commission"].FormattedValue.ToString()) * (double.Parse(dataGridView1.Rows[i].Cells["price"].FormattedValue.ToString()));
        }

    }

, кажется, что без параметра FormattedValue он и указание Rows[i] и Cells[i] просто не доходили до значений.Также необходимо отключить функцию allowusertoaddrows, чтобы она не учитывала последнюю строку.Это не проблема, так как она доступна только для чтения.

Мохгерт, спасибо за ваш ответ, будет выглядеть, если заменить раздел for ... else на case, теперь он работает как

0 голосов
/ 17 января 2012

Небольшие изменения с некоторыми примечаниями:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    switch (row["currency"].ToString())
    {
        case "USD":
            myCommission += double.Parse(row["commission"].ToString()) * (double.Parse(row["price"].ToString()) * UStoGB); 
            break;

        case "EURO":
            myCommission += double.Parse(row["commission"].ToString()) * (double.Parse(row["price"].ToString()) * EUtoGB); 
            break; 

        case else:
            myCommission += double.Parse(row["commission"].ToString()) *(double.Parse(row["price"].ToString());
            break; 
    }
}

Не то чтобы это был лучший ответ, но изменение его на foreach позволит вам поставить часы в ряд, чтобы определить точные имена столбцов. Имена столбцов могут быть чувствительными к регистру, или импорт XML мог что-то сделать с именем столбца.

В любом случае можно установить точку останова и посмотреть значение ячеек строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...