vikil chandrapati Ответов: 1

Как исправить сброс данных gridview


Каждый раз, когда я добавляю скидку к товару, цена для каждого товара в gridview сбрасывается. Первый вход работает отлично
Вход 1[^]

Проблема начинается со второго входа, где первый входной элемент сбрасывается, если только вы не введете скидку
Вход 2[^]
затем продолжает происходить
Вход 4[^]

я пробовал переписать весь код и отладить его, но не уверен, что что-то не так. Thx за помощь

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

Это лучшее исправление, которое я смог придумать, чтобы поместить все это под отправителем кнопки и сделать его оператором if, но все еще не исправляет его
private void BtnGlobal_Click(object sender, EventArgs e)
        {
            Button BtnGlobal = (Button)sender;
            var global = BtnGlobal.Text;
         
            foreach (Book book in MyBooks)
            {
                if (global == book.BookName)
                {
                    Arraytxt.Text = Arraytxt.Text + book.ToString() + Environment.NewLine;
                }
            }
            if (global.ToLower().Contains('%'))
            {
                //Discount
                Button Discount = (Button)sender;
                
                //Discount Spliter
                string DiscountInput = Discount.Text;
                var DiscountSplit = Regex.Match(DiscountInput, @"\d{2,3}");
                int length = DiscountSplit.ToString().Substring(DiscountSplit.ToString().IndexOf(".") + 1).Length;
                if (length == 2)                  
                {
                    int row = 0;
                    row = POSDGV.Rows.Count - 1;
                    POSDGV["Discount", row].Value = "0." + DiscountSplit.ToString();

                    foreach (DataGridViewRow Column in POSDGV.Rows)
                    {
                        Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = ((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) - ((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Discount"].Index].Value)))) *Convert.ToDouble(Column.Cells[POSDGV.Columns["Amount"].Index].Value));
                    }
                }
                else if (length == 3)
                {
                    int row = 0;
                    row = POSDGV.Rows.Count - 1;
                    POSDGV["Discount", row].Value = 0;

                    foreach (DataGridViewRow Column in POSDGV.Rows)
                    {
                        Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = (((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) - ((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Discount"].Index].Value)))) *Convert.ToDouble(Column.Cells[POSDGV.Columns["Amount"].Index].Value))) * 0;
                    }
                }
                
            }
            else
            {
                //Item Buttons
                foreach (Book book in MyBooks)
                {
                    if (global == book.BookName)
                    {
                        Arraytxt.Text = Arraytxt.Text + book.ToString() + Environment.NewLine;
                    }
                }
                //Item Spliter
                string input = Arraytxt.Text;
                var PriceSplit = Regex.Match(input, @"(?<=\$)\d+");
                var BookSplit = Regex.Match(input, @"[^\$]*");

                Booktxt.Text = BookSplit.ToString();
                Pricetxt.Text = PriceSplit.ToString();
                
                //Item Adder
                int row = 0;
                POSDGV.Rows.Add();
                row = POSDGV.Rows.Count - 1;
                POSDGV["BookName", row].Value = Booktxt.Text;
                POSDGV["Price", row].Value = Pricetxt.Text;
                POSDGV["Amount", row].Value = 1;

                //Calculation
                foreach (DataGridViewRow Column in POSDGV.Rows)
                {
                    for (int i = 0; i < POSDGV.Rows.Count; ++i)
                    {
                        if (POSDGV.Rows[i].Cells[2].Value == null)
                        {
                            Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = (Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Amount"].Index].Value));
                        }
                        else
                        {
                            Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = (Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Discount"].Index].Value)) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Amount"].Index].Value);
                        }
                    }
                }
                int buffer = 0;
                buffer = POSDGV.Rows.Count - 1;
                POSDGV["Discount", buffer].Value = 1;

                //GST, Subtotal and total
                decimal sum = 0;
                for (int i = 0; i < POSDGV.Rows.Count; ++i)
                {
                    sum += Convert.ToDecimal(POSDGV.Rows[i].Cells[3].Value);
                }
                lblSub.Text = sum.ToString("c2");
                var GST = sum * 0.10m;
                lblGST.Text = GST.ToString("c2");
                lblTotal.Text = (sum + GST).ToString("c2");

                Booktxt.Clear();
                Pricetxt.Clear();
                Arraytxt.Clear();
            }
        }

Gerry Schmitz

Для обновления "одной" строки вы делаете много "циклов строк".

(И ссылка на "строку" DGV в качестве столбца тоже не помогает делу)

1 Ответов

Рейтинг:
0

CHill60

Вы говорите, что пытались отладить этот код, но не можете понять, что не так - это просто говорит мне, что вам неудобно с отладчиком. Вы можете добавить часы к изменяющимся данным и даже установить точку останова, чтобы остановить программу при изменении значения. Таким образом, вы можете точно определить линию, которая наносит ущерб, и решить, что делать.
Попробуйте сначала прочитать эту статью Освоение отладки в Visual Studio 2010 - руководство для начинающих[^На самом деле здесь есть целый раздел на CP об отладке .. https://www.codeproject.com/KB/debug/[^] - это действительно стоит того, чтобы стать опытным в использовании отладчика.

Как отметил @gerry-schmitz - Не называйте строки в вашем datagridview "столбцом" - в лучшем случае это сбивает с толку в данный момент (для всех нас) - позже, когда вы снова придете к этому коду, вы его вообще не поймете. Используйте что-то вроде

foreach (DataGridViewRow dgr in POSDGV.Rows)
Примечание - Вы уже использовали вызов переменной row так что вы не можете использовать это здесь.

Первое, что я делаю, когда вижу такой код, - это начинаю "приводить его в порядок", также известный как рефакторинг. Я ищу дублированные строки и пытаюсь вытащить их в функции. Когда я это сделал я заметил что эта строка вашего кода
foreach (DataGridViewRow Column in POSDGV.Rows)
                    {
                        Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = (((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) - ((Convert.ToDouble(Column.Cells[POSDGV.Columns["Price"].Index].Value) * Convert.ToDouble(Column.Cells[POSDGV.Columns["Discount"].Index].Value)))) *Convert.ToDouble(Column.Cells[POSDGV.Columns["Amount"].Index].Value))) * 0;
                    }
это точно так же, как
Column.Cells[POSDGV.Columns["FinalPrice"].Index].Value = 0;
и это намного легче читать и понимать, что происходит.

Исправьте свой код, как указано, еще раз попробуйте отладку, определите строку, которая "сбрасывает" значения, и обязательно вернитесь, если вы все еще застряли