0

グリッドをロードするときに使用するプログレス バーを設計しました (ストアド プロシージャからデータグリッドビューをロードします)。ただし、ストアド プロシージャを呼び出すプロセスには、呼び出す項目がいくつかあります (以下を参照)。プログレスバーを機能させるのは早い段階ですが(以下のコードには含まれていないため、なぜここにいるのですか)、私の質問はこれです。

私が追跡しているものの進行状況が複数の異なる方法である場合、進行状況バーは適切に動作しますか? 「LoadGrid」メソッドは、ストアド プロシージャの処理と datagridview のロード (つまり、時間のかかるプロセス) であるため、進行状況を追跡したいものです。使用する正確なコードとは対照的に、適切な手法は何かをもっと尋ねていると思いますが、進行状況バーに関する知識は限られています。「忙しい」というランダムなアイコンを使用できることはわかっていますが、合法的に実行できる場合は、進行状況バーが必要です。

public void btnLoadGrid_Click(object sender, EventArgs e)
{
    frmProgress progressForm = new frmProgress();

    try
    {
        progressForm.MdiParent = this;
        progressForm.Text = "Importing DSC_0";
        progressForm.Top = this.Height / 3 - progressForm.Height / 2;
        progressForm.Left = this.Width / 2 - progressForm.Width / 2;
        //ofd1.Title = "Import legacy DSC balances";
        //this.ofd1.ShowDialog(this);

        //Need code to empty grid before loading
        grd1.Rows.Clear();
        grd1.Refresh();

        //Load grid based on new selections
        GetUserSelections();
        GetUserRelatedInfo();
        LoadLabelForecastType();
        LoadGrid();
    }
    catch (Exception ex)
    {
        util.LogError(ex);
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    }
    Cursor.Current = Cursors.Default;
    progressForm.Close();         

}

そして進行状況バー自体:

namespace AmortClient
{
    public partial class frmProgress : Form
    {
        public frmProgress()
        {
            InitializeComponent();
        }


        public ProgressBar Pbar
        {
            get { return this.pb1; }
        }


    }
}
4

1 に答える 1

0

バックグラウンド スレッドとイベント コールバックを使用するプログレス バーがあります。また、「params」パラメーターとデリゲートを使用して、コード内の任意のプロセスに一般化できるようにします。

ここにいくつかの小さな断片があります...

private delegate T Method(ProgressBarCallBackInterface callingform, params object[] argsobject);

private void frmProgress_Load(object sender, EventArgs e)
{
    if (!string.IsNullOrEmpty(FormTitle))
    {
        lblSampleTitle.Text = FormTitle;
        this.Text = FormTitle;
    }
    else
    {
        lblSampleTitle.Text = string.Empty;
        this.Text = string.Empty;
    }

    bgWorkerThread.RunWorkerAsync();
}

private void bgWorkerThread_DoWork(object sender, DoWorkEventArgs e)
{
    Delegate method = Delegate.CreateDelegate(typeof(Method), instanceOfClassHavingTheFunction, FullFunctionName, true, true);
    if (method != null)
    {
        ReturnValue = ((Method)method)(this, Parameters);
    }
}

public void ReportProgress(int percentage, string statusText)
{
    lblProgress.SetPropertyThreadSafe(() => lblProgress.Text, statusText);
    bgWorkerThread.ReportProgress(percentage);
}

次に、それを使用しているコードが何であれ、呼び出すことができます

if (progressBar != null)
    progressBar .ReportProgress(6, "Verifying Journal Integrity");

Tできないため、私のコードは少し複雑です。そのため、リターンvoidを持つプロセスでこれを実行できるように、いくつかのスイッチと 2 番目のメソッドを追加する必要がありました。voidしかし、基本的な形はそこにあります。

プログレス バーへのエントリ ポイントのサンプルを次に示します。

//note: FunctionName, Class Having Function, Params....
frmProgress _frmProgress = new frmProgress("UpdateRigX", RigFacade.Instance, rigX, dRigVersion, ModuleVersion);
_frmProgress.FormTitle = "Updating RigX...";
_frmProgress.ShowDialog();
于 2013-03-27T17:16:57.723 に答える