我已经使用C#/。Net为我们的Intranet编写了这个应用程序。在一个地方,我正在检查OnLeave事件上的值以自动填充某些字段。问题是,如果用户直接从字段转到“提交”按钮,则会触发OnLeave事件,但不会填写字段。
我在考虑VBA中的DoEvent,看来我可以使用“ Application.DoEvents”,但是当我尝试时,它会以红色突出显示。我还找到了一个叫做“ Render()”的东西,但是当我尝试它时,它会以蓝色突出显示。
谁能告诉我如何让此代码“自动”适应自身,以便正确呈现所有数据?请记住,我对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);”根据我在另一个网站上看到的建议,但这似乎无济于事。
最佳答案
您可以将该代码移至其自己的方法RefreshData
或其他内容中。在txtClientID_OnLeave
中调用此方法。然后在您的按钮提交单击事件中,检查这些文本框是否为空。如果是这样,请在单击事件中执行任何其他操作之前,先调用RefreshData
方法。
您可能会更进一步,并在调用RefreshData
时设置一个标志,并在按钮Submit事件中检查此标志,而不是检查文本框是否为空。如果用户在文本框中输入内容,则提交单击将不会检索应有的数据。
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
}
现在,我确定有更清洁的方法来处理此问题,但是由于您的提交会读取文本框,因此您真正需要的是在提交处理程序执行其操作之前先填充文本框。
关于c# - 您如何获得C#Web应用程序来“追赶”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25631085/