private void Vis(int parent, BaseUtils.IntRangeList irl) { for (int j = 0; j < Outlines.Count; j++) // go thru roll ups, looking for parent, and if off, mark areas as removed from vis { if (Outlines[j].parent == parent) { if (Outlines[j].r.expanded == false) { irl.Remove(Outlines[j].r.start, Outlines[j].r.end - KeepLastEntriesVisibleOnRollUp); // remove this range } Vis(j, irl); // any children.. } } }
private void Button_Click(object sender, EventArgs e) { ExtButtonDrawn but = sender as ExtButtonDrawn; OutlineState rur = but.Tag as OutlineState; if (Parent is ExtPanelDataGridViewScroll) // this implements an efficient visibility change system { rur.r.expanded = !rur.r.expanded; if (rur.r.expanded == false) // off is easy - hide everything { (Parent as ExtPanelDataGridViewScroll).ChangeVisibility(rur.r.start, rur.r.end - KeepLastEntriesVisibleOnRollUp, rur.r.expanded); } else { BaseUtils.IntRangeList irl = new BaseUtils.IntRangeList(); irl.Add(rur.r.start, rur.r.end); Vis(Outlines.IndexOf(rur), irl); // remove visibility of any children marked hidden irl.Sort(); (Parent as ExtPanelDataGridViewScroll).ChangeVisibility(rur.r.start, rur.r.end, irl); } } }
// on areas identify bits to be on. its sorted. startrow-endrow identify the whole range - areas outside onareas are off. public void ChangeVisibility(int startrow, int endrow, BaseUtils.IntRangeList onareas) { if (dgv != null) { dgv.SuspendLayout(); dgv.RowStateChanged -= DGVRowStateChanged; // don't cause repeated call backs int rowpos = startrow; foreach (var r in onareas.Ranges) { while (rowpos < r.Start) { //System.Diagnostics.Debug.WriteLine("Row " + rowpos + " Off"); dgv.Rows[rowpos++].Visible = false; // set state } while (rowpos <= r.End) { //System.Diagnostics.Debug.WriteLine("Row " + rowpos + " On"); dgv.Rows[rowpos++].Visible = true; // set state } } while (rowpos <= endrow) { //System.Diagnostics.Debug.WriteLine("Row " + rowpos + " On"); dgv.Rows[rowpos++].Visible = true; // set state } dgv.RowStateChanged += DGVRowStateChanged; dgv.ResumeLayout(); UpdateScrollBar(); outlining?.UpdateOutlines(); } }
public TestPanelScrollOutlining() { InitializeComponent(); theme = new ThemeStandard(); theme.LoadBaseThemes(); theme.SetThemeByName("Elite Verdana"); theme.WindowsFrame = true; for (int i = 0; i < 100; i++) { DataGridViewRow row = dataGridView1.RowTemplate.Clone() as DataGridViewRow; row.CreateCells(dataGridView1, i.ToString(), "2", "3"); dataGridView1.Rows.Add(row); DataGridViewRow row2 = dataGridView1.RowTemplate.Clone() as DataGridViewRow; row2.CreateCells(dataGridView1, "R2-" + i.ToString(), "2", "3"); dataGridView2.Rows.Add(row2); } Outlining1.ForeColor = Color.Black; Outlining1.Add(5, 22); Outlining1.Add(6, 8); System.Diagnostics.Debug.Assert(Outlining1.Add(6, 8) == false); // should fail Outlining1.Add(8, 12); Outlining1.Add(13, 20); Outlining1.Add(50, 70); Outlining1.Add(40, 80); BaseUtils.IntRangeList rl = new BaseUtils.IntRangeList(); rl.Add(10, 20); rl.Add(40, 60); rl.Dump(); rl.Add(20, 30); rl.Add(50, 60); // no action, all inside 4-60 rl.Add(61, 70); // merge up rl.Dump(); // 10-30, 40-70 rl.Add(35, 39); rl.Dump(); // 10-30, 35-70 rl.Add(32, 33); rl.Sort(); rl.Dump(); // 10-30, 32-33, 35-70 rl.Remove(0, 10); rl.Dump(); // 11-30, 32-33, 35-70 rl.Remove(15, 20); rl.Sort(); rl.Dump(); // 11-14, 21-30, 32-33, 35-70 rl.Remove(21, 30); rl.Dump(); // 11-14, 32-33, 35-70 rl.Add(34, 34); rl.Dump(); // 11-14, 32-70 rl.Remove(50, 60); rl.Dump(); // 11-14, 32-49 61-70 rl.Remove(50, 60); rl.Dump(); // 11-14, 32-49 61-70 rl.Remove(65, 75); rl.Dump(); // 11-14, 32-49 61-64 rl.Remove(60, 62); rl.Dump(); // 11-14, 32-49 63-64 rl.Remove(60, 63); rl.Dump(); // 11-14, 32-49 64-64 rl.Remove(60, 64); rl.Dump(); // 11-14, 32-49 rl.Remove(32, 64); rl.Dump(); // 11-14 rl.Add(32, 49); rl.Remove(30, 64); rl.Dump(); // 11-14 rl.Add(32, 49); rl.Add(100, 200); rl.Remove(1, 300); rl.Dump(); // nothing rl.Add(32, 49); rl.Add(100, 200); rl.Remove(34, 300); rl.Dump(); // 32-33 rl.Add(32, 49); rl.Add(60, 70); rl.Add(100, 200); rl.Remove(34, 150); rl.Dump(); // 32-33 151-200 rl.Remove(32, 200); // removes both start and end block, which are different rl.Dump(); // 0 rl.Add(32, 33); rl.Add(151, 200); rl.Remove(31, 201); // 0 uses the tidy up routine at the end rl.Add(32, 33); rl.Add(151, 200); rl.Add(31, 201); // subsume ranges.. rl.Dump(); // 31-201 }