1

ネットワークで動作する Windows ベース プログラムを作成しました。

最初に、データベースから名前を読み取り、入力した文字に従ってユーザーに表示するオートコンプリートテキストボックスがありました。

プログラムは正常に動作していましたが、時々エラーが発生しました

しかし

今、データベースから読み取る別のオートコンプリート テキスト ボックスを追加しました。最初のオートコンプリートは正常に機能しますが、2 番目のテキスト ボックスに入力しようとすると、このエラーが表示されてフリーズします。

興味深い点は、プログラムがサーバー上で適切に動作し、クライアント上でのみこのエラーが表示されることです。ラップトップまたは他のラップトップで実行してもエラーは発生しませんが、自宅のラップトップでネットワークを作成しましたが、オフィスのクライアントコンピューターでのみエラーが発生します。

この問題を解決するのを手伝ってください。

ありがとうございました

完全な例外の内容は次のとおりです。

-----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 イベント ハンドラーを 1 ステップ実行できる場合は、コードのどの行が例外をトリガーしたかを判断できる場合があります。

于 2013-08-07T17:00:51.347 に答える
0

@Jim Mischel が言ったように、アンマネージ コードに関連しているようです。http://msdn.microsoft.com/en-us/library/ms235442(VS.80).aspxがわからない場合は、次を読み、nxcompat ビットを設定します。

于 2013-08-07T18:37:52.477 に答える