[C#] Zmiana wartości textBox w pliku rdcl

Witam,

Napisałem prosty program, w którym jest kontrolka MicrosoftReportViewer, a dok projektu jest dołączony plik rdcl, w którym jest textBox, w którym napisałem “abc”. Do programu dołączyłem również przycisk. I tu mam pytanie, czy możliwe jest, żeby po naciśnięciu przycisku, program zmienił wartość textbox na np. “def”? Bo nie znalazłem czegoś takiego jak reportViewer1.textBox1.Text = “def”. Czy w ogóle jest możliwe, żeby programowo zmienić jego wartość?

Kontrolki ReportViewer używa się w pewnym sensie podobnie jak kontrolki DataGridView, tzn. jeśli chcesz zmodyfikować to co wyświetlane jest na raporcie, to musisz zmodyfikować to co stanowi DataSource kontrolki ReportViewer, a następnie wywołać metodę RefreshReport(). Najlepiej będzie jeśli jako DataSource kontrolki ReportViewer użyjesz kontrolki BindingSource, a jako DataSource tej kontrolki BindingSource użyjesz np. swoją kolekcję obiektów.

Możesz mi pokazać przykładowy kod? Załóżmy, że w pliku rdcl jest jeden textBox i chcę zmienić tylko jego zawartość.

Jak w tej kolekcji obiektów mam ustawić, żeby było odwołanie tylko do tego textBoxa?

Poza tym obiekt ReportViewer nie posiada właściwości DataSource, a jedyne co odnalazłem to DataBindings.

Próbowałem też robić to parametrami (utworzyłem w pliku rdlc parametr i chciałem żeby w textBoxie wyświetlał mi ten parametr) ale nic mi to nie daje:

public partial class Form1 : Form

    {


        public Form1()

        {

            InitializeComponent();


        }


        private void Form1_Load(object sender, EventArgs e)

        {

            this.reportViewer1.RefreshReport();


        }


        private void button1_Click(object sender, EventArgs e)

        {


            Microsoft.Reporting.WinForms.ReportParameter[] p = new ReportParameter[1];

            p[0] = new ReportParameter();

            p[0].Name = "Report_Parameter_0";

            p[0].Values.Add("dddd");

            reportViewer1.LocalReport.SetParameters(p);

            reportViewer1.LocalReport.Refresh();

        }

    }

Jest tylko napis “The ‘X’ parameter is missing a value”

Masz rację. Mój błąd. Tak to jest jak się korzysta z kreatorów :P. Pod ReportViewer podpinasz konkretny raport, a pod ten raport podpinasz źródła danych (dany raport może mieć ich kilka). Dobrze to widać w kodzie, który generują kreatory. Ogólnie to najistotniejsza jest właściwość (będąca kolekcją) DataSources klasy LocalReport.

Co do reszty, to zamieszczam mini tutorial (za dużo kodu nie trzeba pisać):

Tworzysz sobie klasę SomeClass.cs:

using System;


namespace ReportViewerDemo

{

    public class SomeClass

    {

        public SomeClass(string someField)

        {

            SomeField = someField;

        }


        public string SomeField { get; private set; }

    }

}

Kompilujesz projekt. Następnie dodajesz raport do projektu poprzez Add New Item… -> Report (możesz sobie potem zobaczyć jak działa Report Wizard). Teraz musisz określić przynajmniej jedno źródło danych dla raportu (dany raport może mieć ich kilka)

Dzięki za tutorial, teraz wiem jak to zrobić.

A czy da się tak zrobić np. z tabelą? W pliku rdlc jest możliwość dodania tabeli, ale np. czy mogę dodać obiekt typu DataGridView i potem ustawić, żeby tabela która jest w pliku rdlc była zależna od tego jak wygląda ten obiekt datagridview?

Ja obiektu DataTable pod raport nigdy nie podpinałem, ale na pewno się da (w końcu można podpiąć DataSet).

Jeśli chodzi o Twój problem, to proponuję na razie rozbudować ten przykład, który podałem. Wrzuć sobie na Form-ę jeszcze jedną kontrolkę, tj. DataGridView i jako DataSouce tego DataGridView ustaw ten sam BindingSource (z poziomu okna Właściwości), który jest podpięty pod raport. Kodu Form-y nie musisz zmieniać. Uruchom projekt. Teraz, gdy będziesz modyfikował dane w DataGridView, to będziesz tak na prawdę modyfikował te same dane, które mają być wyświetlane w raporcie. Po każdej modyfikacji danych w DataGridView musisz wywołać metodę Refresh (lub kliknąć odpowiedni przycisk na kontrolce ReportViewer) kontrolki ReportViewer, żeby zobaczyć zmiany.

Bardziej mi chodziło np. o coś takiego że tworzę datagridview w form1 i np. w programie zmieniam sobie ilość kolumn i ilość wierszy i wtedy w pliku rdlc też się to zmienia. Myśłałem czy może jest coś podobnego do przykładu wyżej, że tworzę właściwość typu DataGridview w SomeClass.cs a potem wrzucam to w designerze pliku rdlc do dokumentu i sprawa załatwiona.

Nie wiem, czy istnieje taka możliwość.