Вывод данных в Excel из DataGrid C# WPF

Рейтинг: 1Ответов: 1Опубликовано: 06.06.2023

Имеется проблема вывода данных в Excel из DataGrid. Сам элемент определен так:

<DataGrid AutoGenerateColumns="True" x:Name="dgList" Visibility="Hidden"/>

Чтобы его заполнить и вывести в Excel код реализован в кнопке:

        private void ExportCompButton_Click(object sender, RoutedEventArgs e)
        {
            if (CompsList.SelectedItem == null)
            {
                MessageBox.Show("Сначала выберите соревнование, чтобы экпортировать данные");
                return;
            }
            int idSelectedEvent = (int)CompsList.SelectedItem.GetType().GetProperty("ID_Event").GetValue(CompsList.SelectedItem, null);
            dgList.ItemsSource = db.ResultReg.Where(rr => rr.RegEvent.ID_Event == idSelectedEvent && rr.RegEvent.RegStatus.RegStatusName != "Отклонена" && rr.RegEvent.RegStatus.RegStatusName != "На рассмотрении").Join(db.RegEvent,
            u => u.ID_RegEvent,
            c => c.ID_RegEvent,
            (u, c) => new
            {
                c.Event.NameEvent,
                c.User.LastName,
                c.User.FirstName,
                c.User.PatronymicName,
                u.TopEvent,
                u.UserScore,
                u.Descript
            }).ToList();
            dgList.Columns[0].Header = "Соревнование";
            dgList.Columns[1].Header = "Фамилия";
            dgList.Columns[2].Header = "Имя";
            dgList.Columns[3].Header = "Отчество";
            dgList.Columns[4].Header = "Место";
            dgList.Columns[5].Header = "Результат";
            dgList.Columns[6].Header = "Описание";
            dynamic Excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
            var wb = Excel.Workbooks.Add();
            Excel.DisplayAlerts = false;
            var sheet1 = wb.Sheets[1];
            for (int j = 0; j < dgList.Columns.Count; j++)
            {
                Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[1, j + 1];
                sheet1.Cells[1, j + 1].Font.Bold = true;
                myRange.Value2 = dgList.Columns[j].Header;
                myRange.Interior.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbDarkGray;
                myRange.Font.Color = Microsoft.Office.Interop.Excel.XlRgbColor.rgbWhite;
            }
            for (int i = 0; i < dgList.Columns.Count; i++)
                for (int j = 0; j < dgList.Items.Count; j++)
                {
                    TextBlock b = dgList.Columns[i].GetCellContent(dgList.Items[j]) as TextBlock;
                    if (b == null)
                    {
                        b = new TextBlock();
                        b.Text = "-";
                    }
                    Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[j + 2, i + 1];
                    myRange.Value2 = b.Text;
                    myRange.Columns.AutoFit();
                    myRange.Borders.LineStyle = 1;
                }
            Excel.Visible = true;
        }

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

Дополнение

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

Ответы

▲ 0

Во-первых: Как написали в комментариях используйте Binding. То бишь привязку данных. Во-вторых: Почитайте про Interaction.Triggers и выведите весь процесс из кода позади в вашу модель представления. Это позволит не дергать ваш datagrid и напрямую использовать коллекцию которая его заполняет в модели представления