画像からわかるように、グリッドビュー(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サービスに送信されます。この問題を解決するために私は何ができますか?私はこのアプリケーションをカスタマイズしています。私は元の開発者ではありませんが、それを改善するのは私の仕事です。私はそこにいくつかの同様のエラーがあるが、異なるシナリオがあることを知っている。
スクリーンショット:クエリ
ため私の選択を行う
渡すパラメータ
プログレス
エラーメッセージ