gpt4 book ai didi

winforms - 如何处理在 DataGrid 中的行之间双击导致的异常?

转载 作者:行者123 更新时间:2023-12-04 07:05:26 25 4
gpt4 key购买 nike

我们的 DataGrid-heavy 应用程序喜欢在双击用于调整大小的行之间的空间时抛出异常。异常(exception)是 The " DataGridColumnStyle cannot be used because it is not associated with a Property or a Column in the DataSource.
我们大多数基于 DataGrid 的表单都继承自一种称为 GridForm 的表单。我们的 DataSource 是一个 DataView。我可以在我们的双击事件处理程序中设置一个断点,但它从未到达过。在托管控件的整个窗体的 Show/ShowDialog 调用中捕获到异常。我们现在运行的是 .NET 3.5,但大部分功能是在 .NET 1.1 中构建的。我们当时也有同样的问题。

StackOverflow 自己的 Joel Coehoorn 似乎在这里遇到了同样的问题:http://discuss.fogcreek.com/dotnetquestions/default.asp?cmd=show&ixPost=5780

这是一个我们已经潜伏了 3-4 年的错误,所以解决这个问题将是惊人的。

这是完整的异常(exception):它提示的 DataGridColumnStyle 在我们应用程序中的每个网格之间都不同。我猜这意味着我们有一个列样式,它显示了一个不在绑定(bind)数据集中的列。数据集中包含的列将根据给定表单的需求而变化,因此我们确实需要为可能存在或不存在的列定义一些样式。

System.InvalidOperationException: DataGridColumnStyle of 'Real-Time Bill' cannot be used because it is not associated with a Property or Column in the DataSource.
at System.Windows.Forms.DataGridColumnStyle.CheckValidDataSource(CurrencyManager value)
at System.Windows.Forms.DataGridColumnStyle.GetColumnValueAtRow(CurrencyManager source, Int32 rowNum)
at System.Windows.Forms.DataGridBoolColumn.GetColumnValueAtRow(CurrencyManager lm, Int32 row)
at System.Windows.Forms.DataGrid.RowAutoResize(Int32 row)
at System.Windows.Forms.DataGrid.OnMouseDown(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at CLS.Presentation.MainForm.Main(String[] args) in C:\Users\stuartb.CLS\Documents\Projects\Genesis\CLS.Presentation\MainForm.cs:line 2712

根据要求,这是相关列的定义。 当然,异常并不总是表明这一列。如我之前的编辑中所述,查找不在绑定(bind) DataTable 中的列的列样式会导致此问题。在此示例中,ConsumptionBill 为 不是 在绑定(bind)的数据表中。这种情况下的行为只是不显示列,并且显然在行边框双击时崩溃和烧毁。
this.dataGridBoolColumnClientsConsumptionBill.Alignment = System.Windows.Forms.HorizontalAlignment.Center;
this.dataGridBoolColumnClientsConsumptionBill.AllowNull = false;
this.dataGridBoolColumnClientsConsumptionBill.HeaderText = "Real-Time Bill";
this.dataGridBoolColumnClientsConsumptionBill.MappingName = "ConsumptionBill";
this.dataGridBoolColumnClientsConsumptionBill.Width = 75;

最佳答案

多亏了一点引导挖掘,在约翰的帮助下,我能够通过以下方法解决这个问题。

IList<DataGridColumnStyle> missingColumnStyles = new List<DataGridColumnStyle>();
/// <summary>
/// Adjust the grid's definition to accept the given DataTable.
/// </summary>
/// <param name="table"></param>
protected virtual void AdjustGridForData(DataTable table, DataGrid grid)
{
// Remove column styles whose mapped columns are missing.
// This fixes the notorious, uncatchable exception caused when double-clicking row borders.
var columnStyles = grid.TableStyles[table.TableName].GridColumnStyles;

// Add previously removed column styles back to the grid, in case the new bound table
// has something we removed last time this method was executed.
foreach (var missingColumnStyle in missingColumnStyles)
columnStyles.Add(missingColumnStyle);
missingColumnStyles.Clear();

// Move the offending column styles into a separate list.
var missingColumns = new List<string>();
foreach (DataGridColumnStyle style in columnStyles)
{
if (!table.Columns.Contains(style.MappingName))
missingColumns.Add(style.MappingName);
}
foreach (var column in missingColumns)
{
missingColumnStyles.Add(columnStyles[column]);
columnStyles.Remove(columnStyles[column]);
}
}

关于winforms - 如何处理在 DataGrid 中的行之间双击导致的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1174820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com