39656


Visual Studio Professional 2015  
Version 14.0.25123.00 Update 2  
Microsoft .NET Framework Version 4.7.02046  
C#

返信ありがとうございます。  
シンプルな状態でエラーが再現したので投稿を編集しました。

拡張コントロール使用したらエラーが出ると書いていましたが、  
拡張コントロールなしでエラーが発生することを確認しました。

発生状況・エラー内容  
・`DataGridView`を設置する  
・`DataGridView`の`CellValidating`の中で`DataGridView`の`EndEdit`メソッドを呼んでいる(1)  
・`BindingSource`を設置する  
・`DataSet`を作成する  
・`DataSet`に項目が`「項目１」`のみの`DataTable`を作成する  
・`BindingSource`の`DataSource`は作成した`DataSet`(2)  
・`DataGridView`の`DataSource`は作成した`BindingSource`(3)  
・`Form`起動時に`30`行のデータを表示する(4)  
・1つのセルを選択し、値を削除した直後にマウスホイールを動かす  
⇒エラー

[code]

    型 'System.InvalidCastException' のハンドルされていない例外が System.Windows.Forms.dll で発生しました
    追加情報:型 'System.Windows.Forms.DataGridViewTextBoxCell' のオブジェクトを型 'System.Windows.Forms.IDataGridViewEditingCell' にキャストできません。
    
[/code]

ソース

(2)  
this.bindingSource1.DataSource = this.dataSet11;

(3)  
this.dataGridView1.DataMember = "DataTable1";  
this.dataGridView1.DataSource = this.bindingSource1;

[code]

    public Form1()
    {
        InitializeComponent();
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        // (4)
        for(var i=0; i<30; i++)
        {
            var dr = dataSet11.DataTable1.NewDataTable1Row();
            dr.項目１ = string.Format("{0}", i);
            dataSet11.DataTable1.AddDataTable1Row(dr);
        }
    }
    
    private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
    {
        // (1)
        (sender as DataGridView).EndEdit();
    }
    
[/code]

マウスホイール時の処理中にエラーの原因があるのだろうと思い  
以下のような対応をすると、エラーが出なくなりました。  
が、原因を知った上で正しい対応をしたいです。  
以上、よろしくお願いします

☆☆☆ エラーが出ない方法 ☆☆☆

[code]

    public Form1()
    {
        InitializeComponent();
        // MouseWheelイベント処理を作成する
        this.dataGridView1.MouseWheel += dataGridView1_MouseWheel;
    }
    // マウスホイールイベント
    private void dataGridView1_MouseWheel(object sender, MouseEventArgs e)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    
[/code]

* * *

補足。色々していて、同じキャストエラーが出たソース

[code]

    public Form1()
    {
        InitializeComponent();
        // MouseWheelイベント処理を作成する
        this.dataGridView1.MouseWheel += dataGridView1_MouseWheel;
    }
    // マウスホイールイベント
    private void dataGridView1_MouseWheel(object sender, MouseEventArgs e)
    {
        dataGridView1.FirstDisplayedScrollingRowIndex = 3; // ここでエラーが出る
    }
    
[/code]


CC BY-SA 3.0
2017-11-16T07:41:23.483
39617
2017-11-17T11:41:06.540
2017-11-17T09:20:49.827
26218
26218
question
c# visual-studio
DataGridViewの編集中にマウスホイールを動かすと落ちる


スタックトレースを確認すると[`DataGridView.OnMouseWheel`](http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewMethods.cs,ac6ff698b29aacb2)→[`DataGridView.CommitEdit`](http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewMethods.cs,317b04b624d9433e)→[`DataGridView.CommitEdit`](http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/DataGridViewMethods.cs,0b88877261864f06)で`InvalidCastException`が発生していますね。同メソッドにはいくつかキャストがありますので、いずれかの箇所で前提条件を満たしていないのだと思います。

原因はともかく、対策としては`DataGridView`の派生クラスで`OnMouseWheel`をオーバーライドすればよいと思います。

[code]

    protected override void OnMouseWheel(MouseEventArgs e)
    {
        try
        {
            base.OnMouseWheel(e);
        }
        catch
        {
        }
    }
    
[/code]


CC BY-SA 3.0
2017-11-17T11:41:06.540
39656
2017-11-17T11:41:06.540
5750
39617
answer