Проблема с добавлением источника данных с помощью конструктора отчетов Microsoft RDLC в приложении C# WinForms в .Net 8.0

Я пытаюсь добавить некоторые базовые отчеты в приложение .Net 8.0 C# WinForms с помощью конструктора отчетов Microsoft RDLC и пакета nuget ReportViewerCore.WinForms, и столкнулся с рядом проблем.

Есть ли у кого-нибудь опыт, как заставить это работать и преодолеть эти проблемы?

Шаги, которые я предпринял на данный момент:

  • Установите расширение Microsoft RDLC Report Designer (17.0.0) в Visual Studio Enterprise 2022 (17.10.0).
  • Установите пакет nuget ReportViewerCore.WinForms (15.1.19) в мой проект WinForms (для этого мне сначала пришлось установить Microsoft.CodeAnalysis.Common v4.8.0, который не является текущей версией).
  • Добавьте новый отчет в проект WinForms.
  • В окне «Данные отчета» выберите раскрывающийся список «Новый» и «Набор данных...».
  • Выберите «Объект» в диалоговом окне «Выбор типа источника данных».
  • Выберите класс модели из моего проекта бизнес-модели. Обратите внимание, что на данный момент в списке нет классов из той же сборки (моя сборка WinForms), однако для меня это не проблема.
  • При выборе любого класса в качестве источника данных объекта появляется следующее бесполезное сообщение об ошибке:

  • Чтобы попытаться определить, является ли причиной проблемы что-то, что я сделал конкретно с классами модели, я затем создал новое решение, состоящее только из проекта WinForms и проекта библиотеки классов, и повторил этот процесс, создав абсолютно базовый класс POCO с одним свойством int. Здесь была та же проблема. Однако я обнаружил, что если я извлек интерфейс для этого класса и выбрал его в качестве источника данных, то это сработает. Затем я попробовал это в своем оригинальном решении, и снова это сработало:
 public class Class1 : IClass1
 {
     public int MyProperty { get; set; }
 }
 public interface IClass1
 {
     int MyProperty { get; set; }
 }
  • Обнаружив, что извлечение интерфейса для класса работает, я сделал то же самое для одного из моих более сложных классов модели и попытался добавить его в качестве источника данных. Затем я получаю следующую ошибку (имя класса отредактировано):

  • Затем я вернулся к своему простому классу Class1, добавил к нему строковое свойство, перекомпилировал и попытался удалить и повторно добавить его в качестве источника данных, чтобы получить ту же ошибку.

Я пришел к выводу, что, похоже, существует какая-то проблема с тем, что дизайнер отчета может определить типы CLR в классе, извлечение интерфейса в некоторой степени помогает смягчить эту проблему, но основная проблема может заключаться в том, что дизайнер, в частности " Мастер настройки источника данных», похоже, пытается использовать неправильную версию сборки System.Runtime.

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

Поиск здесь этой проблемы показывает, что у других в прошлом была подобная проблема, но я не могу найти решения, которое решило бы мою конкретную проблему. Я также пробовал использовать более старые версии пакетов nuget ReportViewer, ориентированные на .Net Framework, и они дали мне те же результаты.

Если мне нужно извлечь интерфейсы для любых POCO, которые я хочу использовать для отчетов, я могу с этим смириться. Однако, если я не смогу использовать какие-либо сложные типы (например, объекты, содержащие списки других объектов) для отчетов, это будет препятствием.

Другие вещи, которые я также попробовал: - Нашел папку установки расширения дизайнера отчетов (C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsof‌​t\Rdlc) и нашел файл .net. 8.0 (C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.5) и скопировал последние в первые. Это устраняет невозможность найти System.Runtime, но вводит новую ошибку, связанную с невозможностью загрузить System.Object из System.Private.CoreLib, поскольку родительский объект не существует.

Ed B 23.05.2024 19:00

См. эту ссылку для получения помощи по Visual Studio 2022: github.com/lkosson/…

SoftwareDveloper 29.05.2024 21:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как поясняется в README репозитория ReportViewerCore.WinForms, мастер создания новых наборов данных терпит неудачу при попытке обнаружить классы из проекта. Официальный обходной путь — добавить в проект файл «.xsd» со схемой классов.

В репозитории представлен фрагмент кода для автоматического создания необходимых файлов «.xsd». Вам нужно изменить массив «типы», чтобы включить классы, которые вы хотите использовать:

var types = new[] { typeof(ReportItemClass1), typeof(ReportItemClass2), typeof(ReportItemClass3) };
var xri = new System.Xml.Serialization.XmlReflectionImporter();
var xss = new System.Xml.Serialization.XmlSchemas();
var xse = new System.Xml.Serialization.XmlSchemaExporter(xss);
foreach (var type in types)
{
    var xtm = xri.ImportTypeMapping(type);
    xse.ExportTypeMapping(xtm);
}
using var sw = new System.IO.StreamWriter("ReportItemSchemas.xsd", false, Encoding.UTF8);
for (int i = 0; i < xss.Count; i++)
{
    var xs = xss[i];
    xs.Id = "ReportItemSchemas";
    xs.Write(sw);
}

Если вы используете файлы «.xsd», все должно работать.

Вся информация есть в разделе Проектирование новых отчетов репозитория.

Спасибо вам большое за это. Похоже, проблема связана с самим дизайнером RDLC (а не с репозиторием ReportViewerCore, который, насколько я понимаю, предназначен для добавления поддержки отчетов, а не с дизайнером), поэтому было бы неплохо, если бы Microsoft включила эту информацию в установщик дизайнера отчетов RDLC и не заставил нас полагаться на чтение документации readme в стороннем репозитории, который его использует!

Ed B 30.05.2024 15:02

Насколько я знаю, конструктор RDLC не предназначен для работы на .NET 8. Кажется, их это просто не волнует. То, что создание отчетов работает даже в .NET 8, — это работа по декомпиляции механизма отчетов и его перекомпиляции для .NET 8 в проекте с открытым исходным кодом ReportViewerCore.

BlueM 11.07.2024 12:30

Другие вопросы по теме