Как правильно связать объекты с Reportviewer? - PullRequest
3 голосов
/ 16 марта 2011

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

Я пытаюсь связать данные из коллекции объектов (заголовков), где у каждого объекта есть коллекция дочерних объектов (строк). Как это может быть сделано? Ниже приведены фрагменты кода, которые у меня есть в данный момент (somedata - это коллекция объектов заголовка).

Форма Windows с элементом управления ReportViewer имеет следующее:

reportViewer1.ProcessingMode = ProcessingMode.Local;
reportViewer1.LocalReport.LoadReportDefinition(GetReport());
reportViewer1.LocalReport.DataSources.Clear();
var dataSourcesNames = GetDataSourceNames();
var headerSource = new ReportDataSource(dataSourcesNames[0], somedata);
reportViewer1.LocalReport.DataSources.Add(headerSource);
reportViewer1.RefreshReport();

Объект заголовка:

public class ReportHeader{
    readonly string id;
    readonly List<ReportRow> rows;

    public ReportData(Header h) {
        this.id = h.Id;
        rows = new List<ReportRow>();
        foreach(RowObject o in h.Rows){
            rows.Add(new ReportRow(o));
        }
    }

    public string Id { get { return id; } }
    public List<ReportRow> Rows { get { return rows;} }
}

Объект строки:

public class ReportRow{
    readonly decimal sum;
    readonly string type;
    readonly string code;

    public ReportDataRow(RowObject r) {
        sum = r.Sum;
        type = r.Type;
        code = r.Code;
    }

    public decimal Sum { get { return sum; } }
    public string Type { get { return type; } }
    public string Code { get { return code; } }
}

Я создал отчет, который имеет все свойства ReportHeader и список, который должен содержать все строки ReportRow, но он не работает. Единственным решением было создать две отдельные коллекции, коллекцию ReportHeader и коллекцию ReportRow, а затем связать их отдельно, как показано ниже:

var headerSource = new ReportDataSource(dataSourcesNames[0], somedata);
reportViewer1.LocalReport.DataSources.Add(headerSource);
var rowSource = new ReportDataSource(dataSourcesNames[1], somedata.Rows);
reportViewer1.LocalReport.DataSources.Add(rowSource);

С этим решением мне нужно было бы установить какую-то связь между коллекциями ..? Поэтому, пожалуйста, помогите. (обратите внимание, что я значительно упростил объекты для моего вопроса)

1 Ответ

0 голосов
/ 20 апреля 2011

Если я правильно понимаю ваш вопрос. Не могли бы вы просто передать объект bool isHeader, а затем в своей видимости в текстовом поле .rdlc сделать функцию для = Fields! IsHeader.value. Если у вас все поля наслоены и скрыты правильно, вы можете иметь заголовок и данные в одном столбце.

...