1

我编写了一个在网络中工作的 windows 基础程序。

首先,我有一个自动完成文本框,它正在从数据库中读取名称,并根据他们输入的字母向用户显示。

该程序运行正常,但有时会出现该错误

现在我添加了另一个从数据库读取的自动完成文本框,现在第一个自动完成工作正常但是当我想填充第二个文本框时,它会显示此错误并冻结。

有趣的一点是程序在服务器上正常工作,只在客户端显示这个错误。即使在我的笔记本电脑或其他笔记本电脑上执行它时也没有任何错误,我将它们与家里的笔记本电脑建立了网络,它只在办公室的客户端计算机上出现错误。

请帮我解决这个问题。

谢谢你

完整的异常内容是:

-----Exception Type Is : UnHandled
-----Exceptiotn Message is : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
-----Source that causes this error: System.Windows.Forms
-----StackTrace is : at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason,ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason,ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Project1.Program.Main() in C:\Users\ZY\Documents\Visual Studio 2008\Projects\Project1\Project1\Program.cs:line 25

我的自动完成代码是:

private void txtkhrdsharh_TextChanged(object sender, EventArgs e)
   {

            AutoCompleteStringCollection namecollection = new     AutoCompleteStringCollection();
            BLL objbll = new BLL();
            SqlDataReader rea = objbll.SelectSharhlistF(txtkhrdsharh.Text);
            if (rea.HasRows == true)
            {
                while (rea.Read())
                    namecollection.Add(rea["sharh"].ToString());
            }
            rea.Close();

            txtkhrdsharh.AutoCompleteMode = AutoCompleteMode.Suggest;
            txtkhrdsharh.AutoCompleteSource = AutoCompleteSource.CustomSource;
            txtkhrdsharh.AutoCompleteCustomSource = namecollection;
    }
4

3 回答 3

4

您的代码非常混乱。每当文本框中的文本发生更改时,您都会修改自动完成设置。为什么要这么做?通常,您会在创建文本框时设置自动完成功能。就目前而言,每次用户按下文本框上的键时,您都会更改设置。

我承认我不知道为什么(或什至是否)会导致程序崩溃,但这至少可能是一个性能问题,并且可能导致一些非常奇怪的行为。

我怀疑您想重新审视您的实现并在首次显示表单时进行这些自动完成设置。

异常在 Windows 消息处理程序中引发 - 由您的应用程序运行的消息循环。这不是您编写的代码,可能很难看出错误发生在哪里。

但是,确定错误发生的时间将非常有用。如果您可以在调试器中加载程序并单步执行 TextChanged 事件处理程序,您可能能够确定哪一行代码触发了异常。

于 2013-08-07T17:00:51.347 回答
1

我发现了问题。正如吉姆所说,这与我的自动完成代码有关,该代码通过用户输入的每个字母向服务器发送请求。服务器很弱,无法回答这么多请求。我将代码更改为下面的代码,问题就解决了。我把代码放在这里:它可能对第一次想使用自动完成功能的人有用(比如我):

               private void frm1_Load(object sender, EventArgs e)
    {
            AutoCompleteStringCollection namecollectionF = new AutoCompleteStringCollection();
        BLL objbll1 = new BLL();
        SqlDataReader dReader = objbll1.SelectNamelistF();
        if (dReader.HasRows == true)
        {
            while (dReader.Read())

                namecollectionF.Add(dReader["Name"].ToString());

        }
        else
        {
            MessageBox.Show("Data not found");
        }
        dReader.Close();

        txtForooshande.AutoCompleteMode = AutoCompleteMode.Suggest;
        txtForooshande.AutoCompleteSource = AutoCompleteSource.CustomSource;
        txtForooshande.AutoCompleteCustomSource = namecollectionF;
       }
于 2013-08-12T17:04:02.947 回答
0

正如@Jim Mischel 所说,它似乎与非托管代码有关。如果不确定,请阅读以下内容http://msdn.microsoft.com/en-us/library/ms235442(VS.80).aspx并设置 nxcompat 位

于 2013-08-07T18:37:52.477 回答