2014-09-02 36 views
2

我有使用C#/ .Net爲我們的Intranet編寫的這個應用程序。在一個地方,我正在檢查一個OnLeave事件的值來自動填充一些字段。問題是,如果用戶直接從字段到提交按鈕,OnLeave事件觸發但字段不填充。如何獲得C#Web應用程序以「趕上」?

我在考慮VBA中的DoEvents,它看起來像我可能使用「Application.DoEvents」,但是當我嘗試它時,它會以紅色突出顯示。我還發現了一個名爲「渲染()」的東西,但是當我嘗試它時,它會以藍色突出顯示。

任何人都可以告訴我如何讓這段代碼「趕上」自己,以便我所有的數據都能正確渲染?請記住,我對C#還是有點新,所以如果你能夠儘可能的明確/徹底,我會很感激。

編輯

我有這樣的代碼作爲文本框的OnLeave事件:

protected void txtClientID_OnLeave(object sender, EventArgs e) 
    { 
     using (SqlConnection con = new SqlConnection(str2)) 
     { 
      //Query the Reports table to find the record associated with the selected report 
      using (SqlCommand cmd = new SqlCommand("SELECT * FROM VW_MOS_DPL_AccountValidation WHERE CLIENT_ID = '" + txtClientID.Text + "'", con)) 
      { 
       con.Open(); 
       using (SqlDataReader DT1 = cmd.ExecuteReader()) 
       { 
        // If the SQL returns any records, process the info 
        if (DT1.HasRows) 
        { 
         while (DT1.Read()) 
         { 
          try 
          { 
           int TaskID = Convert.ToInt32(ddlTask.SelectedValue); 

           // This should allow Client ID to autofill if Eligibility --> Enrollment records are used. 
           // Add more Task IDs to this list if necessary. 
           List<int> list = new List<int>() { 154, 156, 157, 158, 160, 161, 165 }; 
           if (list.Contains(TaskID)) 
           { 
            //lblAccountName.Text = (DT1["CUST_NM"].ToString()); 
            Label2.Text = (DT1["CUST_NM"].ToString()); 
            //lblAccountName.Visible = true; 
            TBAccountNum.Text = (DT1["CUST_NUM"].ToString()); 
            TBAccountNum.Visible = true; 
           } 
          } 
          catch (Exception ae) 
          { 
           Response.Write(ae.Message); 
          } 
         } 
        } 
        // If the SQL returns no records, return a static "No Records Found" message 
        else 
        { 
         //lblAccountName.Text = "No Matching Account Name"; 
         Label2.Text = "No Matching Account Name"; 
         //lblAccountName.Visible = true; 
         TBAccountNum.Text = ""; 
        } 
       } 
      } 
     } 
    } 

我也有一個提交按鈕,按下按鈕時,第一件事,我想確保所有被這個OnLeave填充的字段實際上都被填充了。問題是,如果我經過它,它們都有值,但是如果我運行它,這些值永遠不會出現在屏幕上。

我也試過「System.Threading.Thread.Sleep(100);」根據我在另一個網站上看到的建議,但這似乎沒有做任何事情。

+2

我想你最好發佈一些代碼,因爲你離開了。 – 2014-09-02 19:42:09

+1

如果這些字段爲空,請在提交點擊時執行自動填寫代碼?很難知道發生了什麼,沒有一些代碼。 – 2014-09-02 19:42:49

+0

您是否使用ASP.NET Web窗體? 2014年? – bzlm 2014-09-02 19:42:55

回答

0

您可以將該代碼移入其自己的方法RefreshData或其他東西。在txtClientID_OnLeave內調用此方法。然後在你的按鈕提交點擊事件,檢查這些文本框是否爲空。如果是,請在點擊事件中執行其他任何操作之前調用RefreshData方法。

當您調用RefreshData時,您可能會進一步並設置一個標誌,並在按鈕提交事件中檢查此標誌,而不是檢查文本框是否爲空。如果用戶在文本框中寫入,則提交點擊不會在其他情況下檢索數據。

private bool _retrievedData = false; 

public void RefreshData() { 
    // do everything you were doing inside the `txtClientID_OnLeave` handler 
    // make sure to set this flag only if the data was successfully retrieved 
    // the bottom of the `try` should be good 
    _retrievedData = true; 
} 

public void txtClientID_OnLeave(object sender, EventArgs e) { 
    RefreshData(); 
} 

public void yourButton_Click(object sender, EventArgs e) { 
    if (_retrievedData == false) 
     RefreshData(); 

    // do whatever you were doing in this handler because now your textboxes have the 
    // data it would have if you had left the textbox without going straight to submit 
} 

現在,我敢肯定,有簡潔的方式來處理這個問題,但由於您提交讀完文本框你真正需要的是填寫的文本框前提交處理程序做它的事。

相關問題