Skip to content

Commit

Permalink
Replaced slow method of calculating column with with faster method.
Browse files Browse the repository at this point in the history
  • Loading branch information
RNoeldner committed Mar 20, 2023
1 parent 05757c5 commit 62cf21d
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ public bool WarnEmptyTailingColumns
set => SetProperty(ref m_WarnEmptyTailingColumns, value);
}

[DefaultValue(2000)]
[DefaultValue(500)]
public int ShowButtonAtLength
{
get => m_ShowButtonAtLength;
Expand Down
6 changes: 3 additions & 3 deletions Library/SharedAssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@
// Version information for an assembly consists of the following four values: Major Version Minor
// Version Build Number Revision You can specify all the values or you can default the Build and.Json
// Revision Numbers by using the '*' as shown below: [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.7.5.580")]
[assembly: AssemblyFileVersion("1.7.5.580")]
[assembly: AssemblyInformationalVersion("1.7.5.580")] // a.k.a. "Product version"
[assembly: AssemblyVersion("1.7.5.581")]
[assembly: AssemblyFileVersion("1.7.5.581")]
[assembly: AssemblyInformationalVersion("1.7.5.581")] // a.k.a. "Product version"
10 changes: 3 additions & 7 deletions Library/WinFormControls/DetailControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public DetailControl()

[Bindable(false)]
[Browsable(true)]
[DefaultValue(2000)]
[DefaultValue(500)]
public int ShowButtonAtLength { get => FilteredDataGridView.ShowButtonAtLength; set => FilteredDataGridView.ShowButtonAtLength = value; }

/// <summary>
Expand Down Expand Up @@ -402,13 +402,9 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
}

private void AutoResizeColumns(DataTable source)
private void AutoResizeColumns()
{
if (source.Rows.Count < 10000 && source.Columns.Count < 50)
FilteredDataGridView.AutoResizeColumns(
source.Rows.Count < 1000 && source.Columns.Count < 20
? DataGridViewAutoSizeColumnsMode.AllCells
: DataGridViewAutoSizeColumnsMode.DisplayedCells);
FilteredDataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
}

private void searchBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
Expand Down
110 changes: 84 additions & 26 deletions Library/WinFormControls/FilteredDataGridView.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public partial class FilteredDataGridView : DataGridView

private bool m_DisposedValue;
private IFileSetting? m_FileSetting;
private int m_ShowButtonAtLength = 2000;
private int m_ShowButtonAtLength = 1000;
private int m_MenuItemColumnIndex;

private void PassOnFontChanges(object? sender, EventArgs e)
Expand Down Expand Up @@ -126,8 +126,7 @@ public FilteredDataGridView()
FontChanged += (_, _) =>
{
AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
AutoSize = true;
AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
};
}

Expand All @@ -150,14 +149,13 @@ public FilteredDataGridView()

[Bindable(true)]
[Browsable(true)]
[DefaultValue(2000)]
[DefaultValue(500)]
public int ShowButtonAtLength
{
get => m_ShowButtonAtLength;
set
{
var newVal = value < 0 ? 0 : value;

var newVal = value < 10 ? 10 : value;
if (m_ShowButtonAtLength == newVal)
return;
m_ShowButtonAtLength = newVal;
Expand Down Expand Up @@ -663,35 +661,95 @@ private static string DefFileNameColSetting(IFileSetting fileSetting, string ext
/// <param name="col"></param>
/// <param name="rowCollection"></param>
/// <returns>A number for DataGridViewColumn.With</returns>
private static int GetColumnWith(DataColumn col, DataRowCollection rowCollection)
private int GetColumnWith(DataColumn col, DataRowCollection rowCollection)
{
using var grap = CreateGraphics();

if (col.DataType == typeof(Guid))
return Math.Max(TextRenderer.MeasureText(grap, "4B3D8135-5EA3-4AFC-A912-A768BDB4795E", Font).Width,
TextRenderer.MeasureText(grap, col.ColumnName, Font).Width)+ 5;

if (col.DataType == typeof(int) || col.DataType == typeof(bool) || col.DataType == typeof(long))
return 25;
return Math.Max(TextRenderer.MeasureText(grap, "626727278", Font).Width,
TextRenderer.MeasureText(grap, col.ColumnName, Font).Width)+ 5;

if (col.DataType == typeof(decimal))
return 50;
return Math.Max(TextRenderer.MeasureText(grap, "626727278.4664", Font).Width, TextRenderer.MeasureText(grap, col.ColumnName, Font).Width)+ 5;

if (col.DataType == typeof(DateTime))
return 110;
{
var maxLen = TextRenderer.MeasureText(grap, col.ColumnName, Font).Width;
var counter = 0;
var lastIncrease = 0;
foreach (DataRow dataRow in rowCollection)
{
if (dataRow[col] is DateTime dtm)
{
var len = TextRenderer.MeasureText(grap, StringConversion.DisplayDateTime(dtm, CultureInfo.CurrentCulture), Font).Width;
if (len>maxLen)
{
lastIncrease= counter;
maxLen = len;
}

}
if (counter > 20000 || counter-lastIncrease > 500)
break;
counter++;

}
return maxLen + 5;
}


if (col.DataType == typeof(string))
{
var maxLen = TextRenderer.MeasureText(grap, col.ColumnName, Font).Width;
var counter = 0;
var lastIncrease = 0;
foreach (DataRow dataRow in rowCollection)
{
var value = dataRow[col];
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (value is null)
var textLen = dataRow[col]?.ToString()?.Length ?? 0;
if (textLen ==0)
continue;
#pragma warning disable CS8602 // Dereference of a possibly null reference.
switch (value.ToString().Length)
if (textLen > m_ShowButtonAtLength)
return Math.Max(TextRenderer.MeasureText(grap, "Button", Font).Width,
TextRenderer.MeasureText(grap, col.ColumnName, Font).Width) + 5;

var len = TextRenderer.MeasureText(grap, dataRow[col]!.ToString(), Font).Width;
if (len>maxLen)
{
case > 80:
return 350;
case > 15:
return 225;
lastIncrease= counter;
maxLen = len;
}
#pragma warning restore CS8602 // Dereference of a possibly null reference.
if (counter > 20000 || counter-lastIncrease > 500 || maxLen>Width/2)
break;
counter++;
}
return Math.Min(maxLen, Width/2) + 5;
}

return 100;
return Math.Max(TextRenderer.MeasureText(grap, "dummy", Font).Width, TextRenderer.MeasureText(grap, col.ColumnName, Font).Width);
}

public new void AutoResizeColumns(DataGridViewAutoSizeColumnsMode autoSizeColumnsMode)
{
if (DataView == null)
base.AutoResizeColumns(autoSizeColumnsMode);
else
{
foreach (DataColumn col in DataView!.Table.Columns)
{
foreach (DataGridViewColumn newColumn in Columns)
{
if (newColumn.DataPropertyName == col.ColumnName)
{
newColumn.Width = GetColumnWith(col, DataView!.Table.Rows);
break;
}
}
}
}
}

// To detect redundant calls
Expand Down Expand Up @@ -977,10 +1035,10 @@ private void GenerateDataGridViewColumn()

if (wrapColumns.Contains(col))
newColumn.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

newColumn.Width = oldWith.TryGetValue(newColumn.DataPropertyName, out var value) && !showAsButton.Contains(col) ?
value : showAsButton.Contains(col) ? 25 : GetColumnWith(col, DataView.Table.Rows);

newColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
newColumn.Width =
oldWith.TryGetValue(newColumn.DataPropertyName, out var value) ? value :
GetColumnWith(col, DataView.Table.Rows);
Columns.Add(newColumn);
}
}
Expand Down Expand Up @@ -1419,7 +1477,7 @@ private async void ToolStripMenuItemSaveCol_Click(object? sender, EventArgs e)
#endif
// ReSharper disable once UseAwaitUsing
using var stream = new ImprovedStream(new SourceAccess(fileName, false));
#if NET5_0_OR_GREATER
#if NET5_0_OR_GREATER
await
#endif
using var writer = new StreamWriter(stream, Encoding.UTF8, 1024);
Expand Down

0 comments on commit 62cf21d

Please sign in to comment.