Générer des colonnes dynamiquement dans RDLC
Je suis en train de générer un RDLC rapport à ASP.NET où les colonnes de mon jeu de données qui sera dynamique et déterminée qu'au moment de l'exécution.
J'ai fait une fonction qui retourne une Table de données, et par la sélection de cette fonction dans la RDLC de l'assistant rapport, je peux générer mon rapport avec succès.
public DataTable GetTable()
{
//Here we create a DataTable with four columns.
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("testColumn", typeof(DateTime));
//Here we add five DataRows.
table.Rows.Add(25, "Indocin", "David", DateTime.Now);
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
return table;
}
Mais, si je fais une légère modification de la fonction de façon à ce que ma datatable est vraiment dynamique, alimenter les colonnes de la base de données, ma fonction n'apparaît pas dans le rapport de l'assistant.
C'est ma changé fonction
public DataTable GetTable2()
{
//Here we create a DataTable with four columns.
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Columns.Add("testColumn", typeof(DateTime));
SqlConnection connection = new SqlConnection();
connection = Connection.getConnection();
connection.Open();
string tableName = "";
tableName += "Subject";
string Query = "select * from " + tableName + " where Status = 0;";
SqlDataAdapter da = new SqlDataAdapter(Query, connection);
DataSet ds = new DataSet();
da.Fill(ds);
DataRowCollection collection = ds.Tables[0].Rows;
foreach (DataRow row in collection)
{
//Here we add five DataRows.
table.Rows.Add(25, "Indocin", "David", DateTime.Now);
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
}
connection.Close();
return table;
}
Vous voyez, la seule modification que j'ai apportée à la fonction est l'interrogation de la base de données et de générer le rapport dataset colonnes à l'intérieur de la boucle qui parcourt la base de données.
Mais en raison de ce changement, ma fonction n'apparaît pas dans le Rapport de l'Assistant. Si je omettre le code, il apparaît de nouveau.
Je peux utiliser cette fonction pour générer un GridView bien, mais le problème est avec RDLC rapports.
Mon objectif est de générer le rapport datatable à l'aide de résultats de base de données. S'il vous plaît aider moi.
OriginalL'auteur Shuaib | 2015-03-06
Vous devez vous connecter pour publier un commentaire.
J'ai eu la même demande et a fait un peu de l'enquête de solutions.
Je n'ai pas toutes les essayer, mais encore de la liste de ceux que je pense faire sens.
Parce que RDLC n'est pas facile à réaliser colonnes dynamiques. Vous pouvez simplement changer de RDL.
Liste de toutes les colonnes, puis masquer ceux que vous n'avez pas besoin
Cela fonctionne lorsque votre colonnes ayant un max de limitation et assez facile à mettre en œuvre par le réglage de la Colonne "visibilité" avec l'expression.
Créer RDLC au moment de l'exécution
RDLC est basé sur XML, il est donc logique que vous générez un RDLC au moment de l'exécution qui correspondent à votre structure de données.
Eh bien, je n'ai pas choisi cette car je pense que le schéma de RDLC est un peu compliqué en plus de ma table est en fait simple, même il a besoin de colonnes dynamiques.
Si vous avez vraiment besoin d'utiliser cette solution ultime vous pouvez chercher si il y a une sorte de libs qui peut vous aider avec la construction.
Diviser le tableau dans la liste de cellules et de remontage par groupe de ligne et de colonne d'identité
Ceci a été suggéré par mon collègue Jimmy.
Très orthodoxe, mais je l'ai trouvé très utile si votre table n'a pas de structures complexes comme ColumnSpan ou des trucs. Le détail comme dans l'exemple ci
J'ai besoin de la quantité totale par mois ou de l'année, et le résultat de la nécessité de les former comme
De groupe par mois je peux la liste de tous les 12 mois et masquer ceux que je n'avez pas besoin.
Toutefois, il ne fonctionne pas quand le groupe de l'année.
Pour mettre en œuvre la solution 4.
Tout d'abord, Préparer la DataTable formé exactement que vous avez besoin.
Second, de Diviser la DataTable dans
List<ReportCell>
.Troisième, Utilisez cette Liste comme la source de ReportViewer.
Enfin, Dans RDLC ajouter une table. Supprimer tout sauf le champ de données.
Des données de jeu avec la propriété "Valeur".
Puis Ajouter le Groupe Parent Par le "Nomcolonne" de la propriété(Supprimer le tri)
et faire des groupes de Détails sur le "RowId" propriété
Maintenant, le rdlc devrait pouvoir afficher tout exactement formé comme le DataTable.
Pour une meilleure compréhension, j'ai fait un projet de démonstration sur mon GitHub.
OriginalL'auteur 蕭為元