代码之家  ›  专栏  ›  技术社区  ›  Samantha Branham

如何处理由于双击DataGrid中的行而导致的异常?

  •  2
  • Samantha Branham  · 技术社区  · 15 年前

    当双击用于调整大小的行之间的空间时,我们的DataGrid繁重的应用程序喜欢抛出异常。例外情况是 The " DataGridColumnStyle cannot be used because it is not associated with a Property or a Column in the DataSource.

    我们大多数基于数据报的表单继承自一个称为GridForm的表单。我们的数据源是一个数据视图。我可以在双击事件处理程序中设置一个断点,但从未到达。在承载控件的整个窗体的Show/ShowDialog调用中捕获except。我们现在运行的是.NET 3.5,但大部分功能都是在.NET 1.1中构建的。我们那时也有同样的问题。

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

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


    完全例外: 它抱怨的DataGridColumnStyle在我们的应用程序中的每个网格之间都不同。我猜这意味着我们有一个列样式,显示一个不在绑定数据集中的列。数据集中包含的列将根据给定表单的需要而更改,因此我们确实需要为可能存在或不存在的列定义一些样式。
    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
    


    根据要求,这里是相关列的定义。 当然,异常并不总是指示此列。正如我以前的编辑中所指出的,查找未绑定数据表中的列的列样式会导致此问题。在这个例子中,消费账单是 在绑定的数据表中。这种情况下的行为只是让列不显示,并且明显地在行边界上崩溃和烧录双击。
    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;
    
    1 回复  |  直到 15 年前
        1
  •  3
  •   Samantha Branham    15 年前

    在约翰的帮助下,通过一些指导性的挖掘,我可以用以下方法解决这个问题。

    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]);
        }
    }