Improve Context Menu performance.

This commit is contained in:
Michael Bucari-Tovo 2022-05-09 14:38:14 -06:00
parent 19262bceac
commit 725979afb0
2 changed files with 81 additions and 71 deletions

View File

@ -78,6 +78,7 @@
this.dataGridViewTextBoxColumn10, this.dataGridViewTextBoxColumn10,
this.dataGridViewTextBoxColumn11, this.dataGridViewTextBoxColumn11,
this.dataGridViewImageButtonBoxColumn2}); this.dataGridViewImageButtonBoxColumn2});
this.gridEntryDataGridView.ContextMenuStrip = this.contextMenuStrip1;
this.gridEntryDataGridView.DataSource = this.gridEntryBindingSource; this.gridEntryDataGridView.DataSource = this.gridEntryBindingSource;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window; dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Window;

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
@ -35,46 +36,6 @@ namespace LibationWinForms
// alias // alias
private DataGridView _dataGridView => gridEntryDataGridView; private DataGridView _dataGridView => gridEntryDataGridView;
protected override void OnVisibleChanged(EventArgs e)
{
contextMenuStrip1.Items.Add(new ToolStripLabel("Show / Hide Columns"));
contextMenuStrip1.Items.Add(new ToolStripSeparator());
//Restore Grid Display Settings
var config = Configuration.Instance;
var displayIndices = config.GridColumnsDisplayIndices;
var hiddenGridColumns = config.HiddenGridColumns;
int columnIndex = 0, numVisible = 0;
foreach (DataGridViewColumn column in _dataGridView.Columns)
{
var visible = !hiddenGridColumns.Contains(column.DataPropertyName);
var itemName = column.DataPropertyName;
var menuItem = new ToolStripMenuItem()
{
Text = itemName,
Checked = visible,
Tag = itemName
};
menuItem.Click += HideMenuItem_Click;
contextMenuStrip1.Items.Add(menuItem);
column.Visible = visible;
column.DisplayIndex = displayIndices[columnIndex++];
column.HeaderCell.ContextMenuStrip = contextMenuStrip1;
if (visible) numVisible++;
}
if (numVisible == 0)
{
_dataGridView.ContextMenuStrip = contextMenuStrip1;
}
base.OnVisibleChanged(e);
}
public ProductsGrid() public ProductsGrid()
{ {
InitializeComponent(); InitializeComponent();
@ -86,35 +47,6 @@ namespace LibationWinForms
EnableDoubleBuffering(); EnableDoubleBuffering();
} }
private void HideMenuItem_Click(object sender, EventArgs e)
{
var menuItem = sender as ToolStripMenuItem;
var propertyName = menuItem.Tag as string;
var column = _dataGridView.Columns
.Cast<DataGridViewColumn>()
.FirstOrDefault(c => c.DataPropertyName == propertyName);
if (column != null)
{
var visible = menuItem.Checked;
menuItem.Checked = !visible;
column.Visible = !visible;
Configuration.Instance.HiddenGridColumns =
_dataGridView.Columns
.Cast<DataGridViewColumn>()
.Where(c=>!c.Visible)
.Select(c => c.DataPropertyName)
.ToArray();
_dataGridView.ContextMenuStrip =
_dataGridView.Columns
.Cast<DataGridViewColumn>()
.Where(c => c.Visible).Any() ?
default(ContextMenuStrip) : contextMenuStrip1;
}
}
private void EnableDoubleBuffering() private void EnableDoubleBuffering()
{ {
var propertyInfo = _dataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var propertyInfo = _dataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
@ -297,6 +229,73 @@ namespace LibationWinForms
private GridEntry getGridEntry(int rowIndex) => _dataGridView.GetBoundItem<GridEntry>(rowIndex); private GridEntry getGridEntry(int rowIndex) => _dataGridView.GetBoundItem<GridEntry>(rowIndex);
#endregion #endregion
#region Column Customizations
protected override void OnVisibleChanged(EventArgs e)
{
contextMenuStrip1.Items.Add(new ToolStripLabel("Show / Hide Columns"));
contextMenuStrip1.Items.Add(new ToolStripSeparator());
//Restore Grid Display Settings
var config = Configuration.Instance;
var displayIndices = config.GridColumnsDisplayIndices;
var hiddenGridColumns = config.HiddenGridColumns;
var cmsKiller = new ContextMenuStrip();
int columnIndex = 0;
foreach (DataGridViewColumn column in _dataGridView.Columns)
{
var visible = !hiddenGridColumns.Contains(column.DataPropertyName);
var itemName = column.DataPropertyName;
var menuItem = new ToolStripMenuItem()
{
Text = itemName,
Checked = visible,
Tag = itemName
};
menuItem.Click += HideMenuItem_Click;
contextMenuStrip1.Items.Add(menuItem);
column.Visible = visible;
column.DisplayIndex = displayIndices[columnIndex++];
column.HeaderCell.ContextMenuStrip = contextMenuStrip1;
//Setting a default ContextMenuStrip will allow the columns to handle the
//Show() event so it is not passed up to the _dataGridView.ContextMenuStrip.
//This allows the ContextMenuStrip to be shown if right-clicking in the gray
//background of _dataGridView but not shown if right-clicking inside cells.
column.ContextMenuStrip = cmsKiller;
}
base.OnVisibleChanged(e);
}
private void HideMenuItem_Click(object sender, EventArgs e)
{
var menuItem = sender as ToolStripMenuItem;
var propertyName = menuItem.Tag as string;
var column = _dataGridView.Columns
.Cast<DataGridViewColumn>()
.FirstOrDefault(c => c.DataPropertyName == propertyName);
if (column != null)
{
var visible = menuItem.Checked;
menuItem.Checked = !visible;
column.Visible = !visible;
Configuration.Instance.HiddenGridColumns =
_dataGridView.Columns
.Cast<DataGridViewColumn>()
.Where(c => !c.Visible)
.Select(c => c.DataPropertyName)
.ToArray();
}
}
private void gridEntryDataGridView_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e) private void gridEntryDataGridView_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
{ {
Configuration.Instance.GridColumnsDisplayIndices Configuration.Instance.GridColumnsDisplayIndices
@ -305,5 +304,15 @@ namespace LibationWinForms
.Select(c => c.DisplayIndex) .Select(c => c.DisplayIndex)
.ToArray(); .ToArray();
} }
#endregion
}
class ContextMenuStripEx : ContextMenuStrip
{
protected override ToolStripItem CreateDefaultItem(string text, Image image, EventHandler onClick)
{
return base.CreateDefaultItem(text, image, onClick);
}
} }
} }