Это довольно частая ситуация, с которой сталкивались и сталкиваются очень многие. Причем мы описываем случай наиболее характерный для Windows XP SP3, а IDE могут быть разными, то есть это различные версии Visual C# либо же sharpDevelop. Ситуация во многом патовая, потому как по существу становится невозможным нормально программировать, элементы типа DataGridView при запуске отладки приложения вызывают ошибку AccessViolationException was unhandled Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
А полный текст ошибки выглядит так:
System.AccessViolationException was unhandled
Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt." Source="System.Drawing" StackTrace: at System.Drawing.SafeNativeMethods.Gdip.GdipDrawRectangleI(HandleRef graphics, HandleRef pen, Int32 x, Int32 y, Int32 width, Int32 height) at System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height) at System.Drawing.Graphics.DrawRectangle(Pen pen, Rectangle rect) at System.Windows.Forms.DataGridView.PaintBorder(Graphics g, Rectangle clipRect, Rectangle bounds) at System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e) at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.DataGridView.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods. IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.Run(Form mainForm) at test0001.Program.Main() in C:\kzm_list_coder\test0001\test0001\Program.cs:line 18 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException:
Причем перестают компилироваться и старые проекты, которые были созданы и нормально компилировались на других ОС и так далее.
В интернете довольно много советов типа «переустановите ОС», «переустановите NET Framework», «переустановите Visual Studio», но они не разрешают ситуацию.Что же делать в таком случае? Реальное решение ситуации — переопределить классы используемых компонент, которые вызывают ошибку прорисовки.
Давайте все покажем на простом примере. Создаем новый проект C# Windows Application. На форму помещаем DataGridView, нажимаем F5 и видим нашу ошибку. Теперь заходим в файл Form1.Designer.cs. Там вписываем: class NewDataGridView : System.Windows.Forms.DataGridView
{ public NewDataGridView() { DoubleBuffered = true; } }а строку this.dataGridView1 = new System.Windows.Forms.DataGridView();
меняем на this.dataGridView1 = new NewDataGridView();
Запускаем приложение на отладку, вуаля, проблема решена. И работать с DataGridView вы можете в обычном режиме.
Кристофер
|