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


(eureka 170) #1

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ść?


(Tomek Matz) #2

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.


(eureka 170) #3

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"


(Tomek Matz) #4

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)


(eureka 170) #5

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?


(Tomek Matz) #6

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.


(eureka 170) #7

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.


(Tomek Matz) #8

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