С# Winforms привязывает DataTable к элементу управления ReportrViewer

У меня возникли проблемы с попыткой привязать dataTable к элементу управления ReportViewer в Winform с помощью С#.

Я провел МНОГО времени, просматривая этот и другие форумы в поисках решений, но, увы, пока не нашел. Я поместил маркеры отладки в свой код и могу «видеть» готовую таблицу данных с правильным сводным отчетом по массиву 2x2. Но когда я пытаюсь привязать dataTable к объекту ReportViewer, я получаю пустой экран. Я УВЕРЕН, что в моем коде не хватает чего-то простого, но не могу понять, что это такое!!!

Вот более подробная информация о моей форме отчетности:

  1. У меня есть 2 глобальных поля, определенных следующим образом:
    /*create global dataTable */
    DataTable _dTable = new DataTable("dtQOPS3710");

    /* create a new Dataset...*/
    Dataset _dSet = new Dataset("psysReporting.dSetReportViewer.xsd");

А вот код, который я использую для создания dataTable и привязки его к ReportViewer:

/добавить столбцы в dataTable (всего 10)/

        _dTable.Columns.Add(new DataColumn("Nationality", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Total_Females", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Total_Males", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.55", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.56", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.57", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.58", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.25", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Elig.26", typeof(String)));
        _dTable.Columns.Add(new DataColumn("Total_Patients", typeof(String)));

        /* now add the rows */
        for (int i = 0; i < _intMaxNoOfRows; i++)
        {
            DataRow dataRow = _dTable.NewRow();

            for (int j = 0; j < _maxJ; j++)
            {
                if (strArrayList[i, 1] != string.Empty)   /* column 1 = Nationality */
                    dataRow[j] = strArrayList[i, j];
            }

            if (strArrayList[i, 1] != string.Empty)        /* column 1= Nationality */
            {
               _dTable.Rows.Add(dataRow);  
            }

        }

        // add datatable '_dTable' to dataset '_dSet'...
        _dSet.Tables.Add(_dTable); 

        // bind dataSet to report viewer
        this.reportViewer1.Reset();
        this.reportViewer1.ProcessingMode = ProcessingMode.Local;
        this.reportViewer1.LocalReport.ReportEmbeddedResource = "psysReporting.Report1.rdlc";
        this.reportViewer1.LocalReport.DataSources.Clear();
        this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(_dTable.TableName, _dTable));

        this.reportViewer1.Refresh();

Как я уже говорил выше, я попытался отладить код и вижу правильный отчет в dataTable, но кажется, что привязка не работает! Я не получаю никаких ошибок при запуске кода!

Любая помощь приветствуется!


person user3081742    schedule 02.12.2014    source источник


Ответы (1)


Я думаю, вы пропустили явную привязку данных в конце (перед обновлением()):

this.reportViewer1.DataBind();

Проверьте StuartLC ответ на этот вопрос.


Еще один момент. Ваш цикл for можно оптимизировать. Проверка национальной принадлежности не зависит от переменной цикла j. Попробуйте это (без ссылки на ваш вопрос, просто говорю):

// now add the rows
for (int i = 0; i < _intMaxNoOfRows; i++)
{
    // column 1 = Nationality
    if (!string.IsNullOrWhiteSpace(strArrayList[i, 1]))
    {
        var dataRow = _dTable.NewRow();
        for (int j = 0; j < _maxJ; j++)
            dataRow[j] = strArrayList[i, j];

        _dTable.Rows.Add(dataRow);  
    }
}
person Askolein    schedule 02.12.2014
comment
Хорошо, поэтому я добавил следующую строку в свой код, как вы предложили: this.reportViewer1.DataBindings.Add(new Binding(_dTable.TableName, _dTable, _dTable.ToString())); this.reportViewer1.Refresh(); Я получаю следующую ошибку при запуске приложения. : Невозможно выполнить привязку к свойству dtQOPS3710 на целевом элементе управления. Имя параметра: PropertyName Как получить имя свойства моей таблицы данных? - person user3081742; 03.12.2014
comment
Итак, этот вопрос решен? Отметьте ответ, пожалуйста. Если у вас есть другая проблема (как описано в вашем свойстве dtQOPS3710), откройте другой вопрос со всеми подробностями. - person Askolein; 04.12.2014
comment
Я решил эту проблему, экспортировав представление данных в книгу Excel! Работает просто отлично! - person user3081742; 07.12.2014