2017-11-22 3 views
0

フォーム用に継承したクラスがあります。このクラスには、とりわけButtonとカスタムDataGridViewが含まれます。C#CellValueNeeded blocksフォーム

DataGridViewは、データベースに応じてアイテムを表示し、読み込みに時間がかかることがあります。私が持っているactualy:

public partial class dlgDetailsObj : Form 
{ 
    List<object> listItem; 
    public dlgDetailsObj(List<object> obj) 
    { 
     listItem = obj; 
     customGridView.CellValueNeeded += onCellValueNeeded; 
     customGridView.VirtualMode = true; 
    } 

    protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 

     customGridView.RowCount = listItem.Count; // When RowCount changes, items are loaded 
    } 

    private void onCellValueNeeded(object sender, DataGridViewCellValueEventArgs e) 
    { 
     if (e.RowIndex >= listItem.Count) 
      return; 

     String value = ""; 
     customItem item = listItem[e.RowIndex]; 
     if (e.ColumnIndex == columnId.Index) 
     { 
      value = item.Name; // If Name is null, it is loaded from dataBase (can take time) 
     } 
     /* Some else if*/ 

     e.Value = value; 
} 

私の問題はcustomGridViewをロードするために開始すると、閉じるボタンがロードされていないと、ユーザーがそれをクリックすることができないということです(ロードが長すぎる場合はキャンセルします)。

ユーザーがキャンセルできるようにコードを挿入するにはどうすればよいですか?

編集

:私は仮想GridViewコントロールを使用してい が

+2

https://msdn.microsoft.com/en-us/library/dd988458(v=vs.110).aspx –

答えて

0

ここでの問題は、UIとデータのロードの両方が同じスレッドで順次起こっているということです(私は私のコードを更新しました)。

したがって、すべてのデータが処理されるまでUIはブロックされます。マルチスレッドを使用して、UIとは別のスレッドでデータをロードするようにしてください。この

public partial class dlgDetailsObj : Form 
{ 
    protected override void OnShown(EventArgs e) 
    { 
     base.OnShown(e); 

     UpdateListFromDatabase(); 
    } 

    private static void UpdateListFromDatabase() 
    { 
     var thread = new Thread(() => 
      { 
       //code that should run separately from the UI 
      }); 
     thread.Start(); 
    }  
} 

よう

何かがここで基本をお届けしますリンクです。

https://visualstudiomagazine.com/Articles/2010/11/18/Multithreading-in-WinForms.aspx

+0

私は私がVirtualModeを使用していますし、私は達成していない私の質問を編集しました自分のコードを自分のコードに適合させる –

+0

データはどこからロードされていますか? –

+0

私の詳細を編集しました。 –

関連する問題