kozmikadam Ответов: 2

Проблема цикла c# while


Всем привет,

Я работаю над проектом и пытаюсь решить ту же проблему за последние 2 недели !
Я принял, я не могу решить и нуждаюсь в некоторой помощи от вас.

В основном у меня есть datagrid и файл excel. У них разные ценности.
В excel у меня есть несколько столбцов, таких как" report_no_1 "или" report_no_1_1 " и т. д. Под этой колонной измерения придут от моего элемента управления DataGrid.

Моя datagrid в основном такая же, просто у меня есть 2 столбца : Report No и Measurement

Я отредактировал отчет no для получения только первого номера из строки. Итак, у меня есть 2 для report_no_2 или report_no_2_12

Пример Шаблона Excel :

Report_No_1 | Report_no_2_1 | Report_no_2_2 |Report_no_3 | и т. д.....

Шаблон элемента управления DataGrid :

2 | 21,3
2 | 22,4
3 | 12,1
5 | 11,1
и т.д.



Все очень просто. Я хочу получить первое число в строке из ячейки excel и сравнить его с моим номером datagrid для всех данных в datagrid. Если они равны, то нужно записать измерение в файл excel под отчетом no.

Я сравниваю их, потому что есть какое-то пустое пространство. Например, в datagrid нет значения 4. Так что мне нужно проверить.

Вот мой код. Если есть только одно пустое пространство ( например, в таблице данных нет значения 4, то мне нужно дать пустое пространство excel), это не работает с первого раза.

Когда я проверил, он кажется равным.И всего через одну строчку я пытаюсь написать excel. Он написал в предыдущей колонке.

Пожалуйста, помогите мне.


akademi - это мой первый индекс столбцов в excel.


int akademi = 5;
raporBos++;

int toplamStr = dataGridView1.Rows.Count;
for (int i = 0; i < toplamStr-1; i++)
     {
       int nope = Int32.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
       double olcumi = double.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
       int abc = 0;
       int cag;
       int gac;
       if (!String.IsNullOrEmpty(raporAralik.Cells[raporBasSatZ, akademi].Value))
           {
            string[] cagF = (raporAralik.Cells[raporBasSatZ, akademi].Value.ToString().Substring(8)).Split('_');
            cag = Int32.Parse(cagF[1]);
            gac = Int32.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
            Debug.WriteLine(gac + " gac || " + cag + " cag");
            int osman = gac - cag;
            while (cag < gac)
                  {
                   Debug.WriteLine("*** "+gac + " gac || " + cag + " cag");
                   akademi++;
                   if (!String.IsNullOrEmpty(raporAralik.Cells[raporBasSatZ, akademi].Value))
                       {
                        string[] cagG = (raporAralik.Cells[raporBasSatZ, akademi].Value.ToString().Substring(8)).Split('_');
                        cag = Int32.Parse(cagG[1]);
                       }

                   abc++;
                   if (abc == 100)
                        {
                         break;
                        }
                    }
                                    
            raporWrkS.Cells[raporBos, akademi] = Math.Round(olcumi, 3);
            akademi++;

       }

       else
           {
            break;
           }
}


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

в то время как петли, если заявления, для петли

Graeme_Grant

Было бы проще привязать коллекцию объектов к DataGrid и выполнять работу непосредственно с этой коллекцией...

kozmikadam

Я открыт для любых предложений. Но не мог понять, что ты имеешь в виду. Можете ли вы показать образец ?

Graeme_Grant

Пользовательский интерфейс (user interface) - это окно просмотра данных для пользователя. Элемент управления DataGrid является просмотр/редактирование пользовательского интерфейса к данным. Вы пытаетесь сделать BL (бизнес-логику) на уровне пользовательского интерфейса.

Поэтому постройте модель данных, а затем привяжите к ней пользовательский интерфейс (DataGrid). Как только вы это сделаете, задача, которую вы хотите выполнить, будет простой и прямой.

См. пример этого ниже в решении 2...

2 Ответов

Рейтинг:
1

Patrice T

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

int akademi = 5;
raporBos++;

int toplamStr = dataGridView1.Rows.Count;
for (int i = 0; i < toplamStr-1; i++)
{
    int nope = Int32.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
    double olcumi = double.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
    int abc = 0;
    int cag;
    int gac;
    if (!String.IsNullOrEmpty(raporAralik.Cells[raporBasSatZ, akademi].Value))
    {
        string[] cagF = (raporAralik.Cells[raporBasSatZ, akademi].Value.ToString().Substring(8)).Split('_');

        cag = Int32.Parse(cagF[1]);
        gac = Int32.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
        Debug.WriteLine(gac + " gac || " + cag + " cag");
        int osman = gac - cag;
        for (int l = 0; l < osman; l++)
        {
            akademi++;
        }
        /*
        while (cag < gac)
        {
            Debug.WriteLine("*** "+gac + " gac || " + cag + " cag");
            akademi++;
            if (!String.IsNullOrEmpty(raporAralik.Cells[raporBasSatZ, akademi].Value))
            {
                string[] cagG = (raporAralik.Cells[raporBasSatZ, akademi].Value.ToString().Substring(8)).Split('_');

                cag = Int32.Parse(cagG[1]);
            }

            abc++;
            if (abc == 100)
            {
                break;
            }
        }
        */
        raporWrkS.Cells[raporBos, akademi] = Math.Round(olcumi, 3);
        akademi++;
    }
    else
    {
        break;
    }
}

Редактор для программистов, как Notepad++ есть такая функция в Visual студии.
Notepad++ Home[^]


Graeme_Grant

5++ :)

Patrice T

Спасибо

Рейтинг:
0

Graeme_Grant

Пример привязки к данным по запросу...

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WinFormDataGridBinding
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            BindData();
        }

        private void BindData()
        {
            Persons.Add(new Person { Name = "Joe", Surname = "Smith" });
            Persons.Add(new Person { Name = "Jane", Surname = "Doe" });

            PersonsBindingList = new BindingList<Person>(Persons);
            dataGridView1.DataSource = new BindingSource(PersonsBindingList, null);
        }

        public List<Person> Persons { get; } = new List<Person>();
        public BindingList<Person> PersonsBindingList { get; private set; }
    }

    public class Person
    {
        public string Name { get; set; }
        public string Surname { get; set; }
    }
}