namespace PrepStep; /// Mostra, per ogni assieme della distinta base, se tutti i suoi componenti /// (ricorsivamente fino ai PRT) sono presenti nell'indice (v) o mancano (x). public class ReportCompletezzaForm : Form { public ReportCompletezzaForm(List<(string Componente, string Descrizione, bool? Completo)> righe) { int completi = righe.Count(r => r.Completo == true); int incompleti = righe.Count(r => r.Completo == false); int nonTrovati = righe.Count(r => r.Completo is null); Text = "Completezza assiemi"; ClientSize = new Size(720, 440); StartPosition = FormStartPosition.CenterParent; Font = new Font("Segoe UI", 9.5f); var lblInfo = new Label { Dock = DockStyle.Top, AutoSize = true, Padding = new Padding(12, 8, 12, 8), Text = $"{completi} completi, {incompleti} incompleti, {nonTrovati} non trovati nell'indice " + $"su {righe.Count} componenti. Nota: la scansione dei .asm è euristica, qualche " + "falso 'incompleto' è possibile.", }; var grid = new DataGridView { Dock = DockStyle.Fill, ReadOnly = true, AllowUserToAddRows = false, AllowUserToDeleteRows = false, RowHeadersVisible = false, SelectionMode = DataGridViewSelectionMode.FullRowSelect, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, }; grid.Columns.Add("componente", "Componente"); grid.Columns.Add("descrizione", "Descrizione"); grid.Columns.Add("completo", "Completo"); grid.Columns["componente"]!.FillWeight = 20; grid.Columns["descrizione"]!.FillWeight = 55; grid.Columns["completo"]!.FillWeight = 25; foreach (var (componente, descrizione, completo) in righe.OrderBy(r => r.Completo).ThenBy(r => r.Componente)) { string testo = completo switch { true => "✓", false => "✗", null => "?" }; int i = grid.Rows.Add(componente, descrizione, testo); grid.Rows[i].DefaultCellStyle.ForeColor = completo switch { true => Color.DarkGreen, false => Color.DarkRed, null => Color.Gray, }; grid.Rows[i].Cells["completo"].Style.Alignment = DataGridViewContentAlignment.MiddleCenter; } Controls.Add(grid); Controls.Add(lblInfo); } }