2017-11-22 5 views
-2

画像からわかるように、グリッドビュー(dgJEARequests)にカスタマイズされた項目を表示する方法があります。ユーザーは、クエリにパラメータを送信する項目を選択しますwhereStatement。しかし、多くのチェックボックス(項目)がマークまたは選択されている場合、dgJEARequestsのすべてのデータをロードするのに、5000レコード以下と言うと、時間がかかるでしょう。そこで、私はWaitProcessing(進行状況バーのあるフォーム)を追加することにしました。私は検索ボタンbtnSearchSelectionをクリックすると、私はこのエラーを取得する:待機中のメッセージフォームのプログレスバー - エラー:InvalidOperationExceptionクロススレッド操作が有効でない - C#

An exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll but was not handled in user code 

追加情報:クロススレッド操作ではない有効な:コントロール「dgJEARequests」は

 private void ShowOnlyCustomSelection() 
    { 
     String whereStatement = ""; 
     List<String> fieldList = new List<String>(); 
     string getStatusName = ""; 
     string _getStatusName = ""; 

     //loop through all the checkboxes 
     for (int i = 0; i < count; i++) 
     { 
      if (_cbStatus[i].Checked) 
      { 
       //getStatusName should give all selected options like this: 'New', 'Started', 'Accepted', etc., then pass it to whereStatement 
       _getStatusName += ("'" + _cbStatus[i].Text + "'" + ",").TrimEnd(); 
      } 
     } 

     //trims the last comma (,) 
     getStatusName = _getStatusName.TrimEnd(','); 
     //textBox1.Text = _getStatusName.TrimEnd(','); //--->>this is for testing 

     //////////// 
     if (getStatusName == "" || getStatusName == null) 
     { 
      { 
       MessageBox.Show("You have not selected your filter(s)!", "Filter Result", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
      } 
     } 
     else 
     { 
      //Build WHERE Statement 
      fieldList.Add("RequestStatus.StatusName IN (" + getStatusName + ")"); 

      if (fieldList.Count > 0) 
      { 
       for (int x = 0; x < fieldList.Count; x++) 
       { 
        if (x == 0) 
        { 
         whereStatement = fieldList[x]; 
        } 
        else 
        { 
         whereStatement = whereStatement + " AND " + fieldList[x]; 
        } 
       } 

       //Seach for Requests 
       jeaRequests = itServices.getRequestsBySQLStatement(whereStatement); 

       //dgJEARequests.DataSource = jeaRequests; 
       requestList = new List<ITWebService.Requests>(jeaRequests.ToList()); 
       dgJEARequests.DataSource = requestList; 
       dgJEARequests.ClearSelection(); 

       lblCountOfRequests.Text = requestList.Count.ToString().ToString() + " requests loaded"; 

      } 
      else 
      { 
       if (chkMine.Checked) 
       { 
        jeaRequests = itServices.getRequestsByAssignedToAndStatusID(JEAUser.UserName, "0"); 
        //dgJEARequests.DataSource = jeaRequests; 
        requestList = new List<ITWebService.Requests>(jeaRequests.ToList()); 
        dgJEARequests.DataSource = requestList; 
        dgJEARequests.ClearSelection(); 
       } 
       else 
       { 
        jeaRequests = itServices.getRequestsBySQLStatement("Requests.ID > 0"); 
        //dgJEARequests.DataSource = jeaRequests; 
        requestList = new List<ITWebService.Requests>(jeaRequests.ToList()); 
        dgJEARequests.DataSource = requestList; 
        dgJEARequests.ClearSelection(); 
       } 
      } 
     } 
    } 
上に作成されたスレッド以外のスレッドからアクセス

これはprogressbarのコードです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace JEAProjectManager 
{ 
    public partial class WaitProcessing : Form 
    { 
     public Action Worker 
     { 
      get; 
      set; 
     } 
     public WaitProcessing(Action worker) 
     { 
      InitializeComponent(); 

      if (worker == null) 

       throw new ArgumentNullException(); 
      Worker = worker; 

     } 
     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 
      Task.Factory.StartNew(Worker).ContinueWith(t => 
      { 
       this.Close(); 
      }, 
      TaskScheduler.FromCurrentSynchronizationContext()); 
     } 
    } 
} 

私は、検索ボタンをクリックすると、この他のためのものです:

クエリパラメータはWebサービスに送信されます。この問題を解決するために私は何ができますか?私はこのアプリケーションをカスタマイズしています。私は元の開発者ではありませんが、それを改善するのは私の仕事です。私はそこにいくつかの同様のエラーがあるが、異なるシナリオがあることを知っている。

スクリーンショット:クエリ

ため

私の選択を行う

Selection

渡すパラメータ

Parameters

プログレス

ProgressBar

エラーメッセージ

Error

答えて

0

に初期化されていることを、確認する必要がありますそれを理解するために私はしばらく時間がかかりました。このため、より良い解決策がある場合、私はわからないが、私はのようなラムダ式の中でこれらのコンポーネントを囲む必要がありました:

lblCountOfRequests.Text = requestList.Count.ToString().ToString() + " requests loaded"; 

それとも

dgJEARequests.Invoke(new Action(() => dgJEARequests.DataSource = requestList)); 
関連する問題