Member 14649908 Ответов: 2

Проблема в зацикливании.нежелательные строки объекта datagridview экспортируются в Excel


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

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

public void exportSelectedRowsToExcel()        {
            // creating Excel Application  
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
            // creating new WorkBook within Excel application  
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
            // creating new Excelsheet in workbook  
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
            // see the excel sheet behind the program  
            app.Visible = true;
            // get the reference of first sheet. By default its name is Sheet1.  
            // store its reference to worksheet  
            worksheet = workbook.Sheets["Sheet1"];
            worksheet = workbook.ActiveSheet;
            // changing the name of active sheet  
            worksheet.Name = DateTime.Now.ToString("yyyyMMddHHmmssfff");

                

            // storing header part in Excel  
            for (int i = 1; i < CategoryGV.Columns.Count + 1; i++)
            {
                worksheet.Cells[1, i] = CategoryGV.Columns[i - 1].HeaderText;
            }

            // storing Each row and column value to excel sheet  
            for (int i = 0; i < CategoryGV.Rows.Count - 1; i++)
            {
                for (int j = 0; j < CategoryGV.Columns.Count; j++)
                {
                    worksheet.Cells[i + 2, j + 1] = Convert.ToString(CategoryGV.Rows[i].Cells[j].Value);
                }
            }


            // save the application 
            workbook.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + 
                 "\\ExportedCategory.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
                  Type.Missing,Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, 
                  Type.Missing, Type.Missing, Type.Missing);
            // Exit from the application  
            app.Quit();
        }


private void btnExportToExcel_Click(object sender, EventArgs e)
        {
            DataGridViewRow row = new DataGridViewRow();

            for (int i = 0; i < CategoryGV.Rows.Count; i++)
            {
                row = CategoryGV.Rows[i];
                if (Convert.ToBoolean(row.Cells["chkBox"].Value))
                {
                    int id = Convert.ToInt16(row.Cells["id"].Value);
                    exportSelectedRowsToExcel();
                    i--;
                }

            }

Herman&lt;T&gt;.Instance

Ну-ка, где вы проверяете, выбрана ли строка? ряд.SelectedIndex никогда не используется

Richard Deeming

В вашем коде нет ничего, что могло бы проверить, выбраны ли строки. Вы просто экспортируете каждую строку.

Вам просто нужно добавить тест внутри вашего цикла:
Скрыть   скопировать код

for (int i = 0; i < CategoryGV.Rows.Count - 1; i++)


Редактировать: На самом деле, это еще хуже: вы экспортируете каждую строку несколько раз. Если у вас есть 10 строк в сетке и выбрано 5, вы экспортируете все 10 строк 5 раз, каждый раз перезаписывая файл.

Правка 2: На самом деле, все еще хуже. Благодаря тому, что i-- в цикле в обработчике событий, если выбрана какая-либо строка, ваша программа войдет в бесконечный цикл, экспортируя все строки снова и снова, пока вы не завершите его.

2 Ответов

Рейтинг:
12

Ashutosh Gpt

сначала получите все выбранные строки и передайте их в свой метод экспорта.
ваши методы экспорта экспортируют все ячейки все время. иттируйте только выбранную строку.

var rows = new List<DataGridViewRow>();
for (int i = 0; i < CategoryGV.Rows.Count; i++)
    {
        var row = CategoryGV.Rows[i];
        if (Convert.ToBoolean(row.Cells["chkBox"].Value))
        {
            rows.add(row);
        }
    }

exportSelectedRowsToExcel(rows);

// storing Each row and column value to excel sheet  
foreach (var row in rows)
{
   for (int j = 0; j < CategoryGV.Columns.Count; j++)
    {
       worksheet.Cells[row.Index, j + 1] = Convert.ToString(row.Cells[j].Value);
     }
}


Рейтинг:
1

Richard Deeming

Добавьте тест внутри вашего цикла в ваш exportSelectedRowsToExcel метод:

for (int i = 0; i < CategoryGV.Rows.Count - 1; i++)
{
    var row = CategoryGV.Rows[i];
    if (Convert.ToBoolean(row.Cells["chkBox"].Value))
    {
        for (int j = 0; j < CategoryGV.Columns.Count; j++)
        {
            worksheet.Cells[i + 2, j + 1] = Convert.ToString(row.Cells[j].Value);
        }
    }
}
Затем измените обработчик событий так, чтобы он экспортировал строки только один раз:
private void btnExportToExcel_Click(object sender, EventArgs e)
{
    bool haveSelectedRows = false;
    
    for (int i = 0; i < CategoryGV.Rows.Count; i++)
    {
        var row = CategoryGV.Rows[i];
        if (Convert.ToBoolean(row.Cells["chkBox"].Value))
        {
            haveSelectedRows = true;
            break;
        }
    }
    
    if (haveSelectedRows)
    {
        exportSelectedRowsToExcel();
    }
}