2012-01-17 10 views
5

Wiem, że możemy powiązać źródłowe źródło danych z RDLC. Próbuję powiązać obiekt podobny sposób następujący:Źródło danych obiektu wiążącego z zagnieżdżonymi obiektami listy w RDLC

public class ContactReportData 
{ 
    public string ContactReportHeading{get;set;} 
    public string ContactReportSubHeading{get;set;} 
    public List<Contact> ContactDetails{get;set;} 
} 

public class Contact { 
    public string ContactName{get;set;} 
    public string ContactDesignation{get;set;} 
} 

Podczas Ustawienie RDLC, znajdzie tylko jeden zestaw danych w czasie, powiedzmy ContactReportData (bez listy kontaktów) lub skontaktować. Sądzę, że tak jest, ponieważ raport wymaga tego w taki sposób.

Chcę to mieć dane przedstawione w raporcie jako: ContactReportHeading ContactReportSubHeading formie tabelarycznej kontaktów w - kontaktowa Imię, oznaczenie.

Mogłem podać to jako szczegóły danych raportu jako statyczne i wiązać tylko listę kontaktów, ale to, co mam, to lista raportów kontaktowych, w których napotykam problem.

+0

Ten sam problem tutaj. Zacząłem od dodania listy do mojego głównego stołu, ale nie miałem pojęcia, jak ją powiązać. OT: Mam nadzieję, że masz zainstalowany VS2010 SP1. To właśnie uderzyłem pierwszy, szukając odpowiedzi. –

Odpowiedz

3

Rozwiązałem to, czyniąc mój obiekt retun jako płaską listę anonimowych obiektów posiadających wszystkie właściwości kontaktu, a także dodatkowe właściwości obiektu nadrzędnego. Następnie w raporcie RDLC dodano tabelę i powiązano właściwości obiektu kontaktu, a następnie dodano grupy do właściwości nadrzędnych.

Podsumowanie służy do tworzenia takiego układu, należy dodać grupowanie.

+1

możesz wyjaśnić, w jaki sposób można wykonać iterację na liście w RDLC? Próbowałem tego i nie renderuje wartość. Co masz na myśli przez dodanie grupowania? – iberodev

0

Prawdopodobnie nie jest to odpowiednia odpowiedź, ale gdy mam ochotę na brak materiału na ten temat, zachęć mnie do zamieszczenia informacji o moich odkryciach.

Załóżmy, że mam zagnieżdżoną listę obiektów podrzędnych w obiekcie nadrzędnym. Jest to bardzo często sytuacja, na przykład, jeśli masz obiekt zamówienia (rodzic), prawdopodobnie będziesz mieć listę elementów zamówienia (dzieci), w jaki sposób wyświetlić wszystkie informacje z rdlc? Istnieją dwa sposoby, 1 za pomocą podraportu, a 2 to używanie grupowania. Zdaję sobie sprawę, że oba mogą osiągnąć to samo, co wyświetla listę szczegółów w raporcie.

public class Order{ 
    public int OrderID {get; set;} 
    public string Descrpition {get; set;} 
    public List<OrderItem> OrderItems {get; set;} 
} 
public class OrderItem{ 
    public int OrderItemID {get; set;} 
    public decimal Price{get; set;} 
} 

Najprostszym sposobem jest użycie grupowania. W przypadku grupowania musisz utworzyć nowy typ danych, który zawiera właściwości elementu nadrzędnego i elementów podrzędnych. Wierzę, że w ten sposób działa również z zagnieżdżoną listą obiektów na wielu poziomach. To może brzmieć głupio, ale przez większość czasu trzeba utworzyć nowy typ danych w każdym razie, ponieważ typy trzeba wyświetlić na raporcie różnią się od obiektów biznesowych:

public class OrderReport{ 
    public int OrderID {get; set;} 
    public string Description {get; set;} 
    public int OrderItemID {get; set;} 
    public decimal Price {get; set;} 
} 

Następnie na RDLC, po prostu trzeba Aby utworzyć grupę wiersza nadrzędnego i grupę wiersza podrzędnego, rodzic powinien być pogrupowany według identyfikatora zamówienia, grupa wierszy potomnych powinna być ustawiona na "pokaż szczegóły". Myślę, że możesz to zrobić wiele razy, aby uzyskać zagnieżdżoną listę obiektów na wielu poziomach.

+0

To brzmi i jest głupie. Co jeśli mamy wiele poziomów zagnieżdżania? Spłaszczanie obiektów jest niezwykle nieefektywne i trudne do osiągnięcia – JavierIEH

1

Naprawdę nie musisz spłaszczać swoich obiektów. Zamiast tego możesz powiązać wiele zestawów danych do raportu. Następnie możesz przypisać do raportu wiele źródeł danych raportu za pomocą kodu. Oto działająca próbka:

List<Loan> loans = new List<Loan>(); 
loans.Add(GetLoanByLoanNumber(loanNumber)); 

LocalReport report = new LocalReport(); 
report.ReportPath = HostingEnvironment.MapPath("~/bin/Report/Receipt.rdlc"); 

ReportDataSource loanDetailsDataSource = new ReportDataSource(); 
loanDetailsDataSource.Name = "LoanDataSet"; //This refers to the dataset name in the RDLC file 
loanDetailsDataSource.Value = loans; 
report.DataSources.Add(loanDetailsDataSource); 

ReportDataSource loanItemsDataSource = new ReportDataSource(); 
loanItemsDataSource.Name = "LoanItemsDataSet"; 
loanItemsDataSource.Value = loans[0].loanItems; 
report.DataSources.Add(loanItemsDataSource); 

ReportDataSource principalPaymentDataSource = new ReportDataSource(); 
principalPaymentDataSource.Name = "PrincipalPaymentDataSet"; 
principalPaymentDataSource.Value = loans[0].principalPayments; 
report.DataSources.Add(principalPaymentDataSource); 

ReportDataSource interestPaymentDataSource = new ReportDataSource(); 
interestPaymentDataSource.Name = "InterestPaymentDataSet"; 
interestPaymentDataSource.Value = loans[0].interestPayments; 
report.DataSources.Add(interestPaymentDataSource); 

Mam nadzieję, że to pomoże komuś!

0

@Bharath ma całkowitą rację mówiąc, że można przypisać raport do więcej niż jednego źródła danych, a kod w tej odpowiedzi obejmuje przypisywanie danych do raportu.

Jeśli tworzysz raport przez projektanta intially, następnie po dwóch źródeł danych dla raportu wygląda tak:

RDLC Report Designer with two DataSets

Aby uzyskać drugi zestaw danych, kliknij prawym przyciskiem myszy na folder w zbiorach danych drzewa i wybierz opcję "Dodaj zestaw danych".

Możesz następnie użyć pól z obu zestawów danych w raporcie; na zrzucie ekranu powyżej pola TextBox są połączone z DataSet1, a tabela jest wypełniana przez DataSet2.

Powiązane problemy