我已经使用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/

10-13 06:58