2013-03-27 2 views
0

그리드를로드 할 때 사용하려는 진행률 막대를 디자인했습니다 (저장 프로 시저에서 DataGridview를로드합니다). 그러나 저장 프로 시저를 호출하는 프로세스에는 호출하는 항목이 다릅니다 (아래 참조). 나는 일찍 진행률 표시 줄을 얻는 일에 착수했다. (그것은 아래의 코드에서 볼 수 없기 때문에 왜 여기에 있는가?)하지만 내 질문은 이것이다.여러 작업이 포함 된 진행률 막대

추적하고있는 진행 상황이 여러 가지 다른 방법 일 때 진행 막대를 제대로 깨울 수 있습니까? "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; } 
     } 


    } 
} 
+0

나는 배경 노동자를 사용하고 방금 루프에 대한 귀하의 모든 "작업"을 포장 진행률 표시 줄을 사용하는 마지막 시간입니다. 여기 제가 사용한 산책입니다. http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo –

+0

좋은 자습서. 매우 기초적이지만 효과적입니다. 내 프로젝트 코드의 원저자가 generics와 delegate에 관한 몇 가지 다른 것들과 함께 우리 시스템을 생각해 냈을 것이다. 나는 단지 그 뒤에 와서 그것을 나중에 패치해야했기 때문에 나는 그저 많이 알고있다. 그것은 그 일이 어떻게 처음 일했는지를 배우는 것을 의미했다 !!! = D – Nevyn

+0

고마워, 나는 이것을 읽고 며칠 동안 시험해 볼 것이다. –

답변

0

우리는 백그라운드 스레드 및 이벤트 콜백을 사용하여 진행률 표시 줄이 있습니다. 또한 "params"매개 변수와 대리자를 사용하여 코드의 모든 프로세스로 일반화 할 수 있습니다.

여기에, 나는 Tvoid 수 없기 때문에

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

내 코드가 약간 더 복잡 호출 할 수 있습니다 ... 다음

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); 
} 

어떤 코드가 그것을 사용하는 몇 가지 작은 snippits 있습니다 그래서 몇 가지 스위치와 보조 방법을 추가하여 void 리턴을 가진 프로세스에서 실행되도록해야했습니다. 그러나 기본 모양이 있습니다. 여기

진행 표시 줄에 진입 점의 샘플입니다

//note: FunctionName, Class Having Function, Params.... 
frmProgress _frmProgress = new frmProgress("UpdateRigX", RigFacade.Instance, rigX, dRigVersion, ModuleVersion); 
_frmProgress.FormTitle = "Updating RigX..."; 
_frmProgress.ShowDialog(); 
+0

이것은 당신이 찾고있는 것보다 더 복잡 할 수 있습니다 ... 그러나 그것은 일반적이고 재사용 가능하다는 장점이 있습니다. :-) – Nevyn