事情是这样的,我是新手,为了熟悉C#,特地想写一个程序来模仿“扫雷”,目前大部分工作已经
完成(还没有计时功能和得分排行榜),就是下面这个问题导致玩完一局后要关闭程序重新打开才可以接着玩。扫雷地图中的格子,我都是用按钮button来实现,根据3种游戏规模的选择,生成个数不等的3组按钮。
每组内部都是2维的(像地图一样,n×n,程序写起来方便)
定义如下:
private System.Windows.Forms.Button[,] bombtable;
我是这么生成的:
bombtable=new Button[16,16];   //16×16的地图接下来play它,然后游戏结束,此时这些按钮上留有“数字”,“地雷”“小红旗”等图案
然后要换10×10,20×20的地图接着玩时,起先看了这里的帖子,用赋值null的方法
来释放原来的地图上的按钮
for
  for
     bombtable[i,j]=null;而新地图上的按钮我也是用new生成:
     bombtable=new Button[16,16]; 或bombtable=new Button[20,20]; 这时,若换成20×20,则按钮的确变多,若换成10×10则按钮数量不变。而且在这两种情况下,刚才游戏结果的“数字”,“地雷”“小红旗”等图案依然在原位置保留了,晕,而且再接着玩时,鼠标点在按钮上时程序也会有问题。看来刚才那局产生的按钮还未释放干净为了写这个简易的“扫雷”,花了我快24小时,希望有高人给小弟指点迷津。
太困了,不能在线等,先谢谢大家了。(由于我是新手,上面表述难免……,大家多多包涵)

解决方案 »

  1.   

    Dispose的方法已经试过了,然后才试的null
    如果把每个按钮都Dispose()则程序出现“程序中出现了未处理的异常”
    会弹出消息提示如下:
    ---------------------------------------------
    有关调用实时(JIT)调试而不是此对话框的详细信息,
    请参阅此消息的结尾。************** 异常文本 **************
    System.NullReferenceException: 未将对象引用设置到对象的实例。
       at mybomb.Form1.middlePlay_Click(Object sender, EventArgs e)
       at System.Windows.Forms.MenuItem.OnClick(EventArgs e)
       at System.Windows.Forms.MenuItemData.Execute()
       at System.Windows.Forms.Command.Invoke()
       at System.Windows.Forms.Control.WmCommand(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.Form.WndProc(Message& m)
       at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    ************** 已加载的程序集 **************
    mscorlib
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///X:/windows/microsoft.net/framework/v1.1.4322/mscorlib.dll----------------------------------------
    System.Windows.Forms
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///x:windows/assembly/gac/system.windows.forms/1.0.5000.0__b77a5c561934e089/system.windows.forms.dll
    ----------------------------------------
    System
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///x:/windows/assembly/gac/system/1.0.5000.0__b77a5c561934e089/system.dll
    ----------------------------------------
    System.Drawing
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///x:/windows/assembly/gac/system.drawing/1.0.5000.0__b03f5f7f11d50a3a/system.drawing.dll
    ----------------------------------------
    mscorlib.resources
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///x:/windows/assembly/gac/mscorlib.resources/1.0.5000.0_zh-chs_b77a5c561934e089/mscorlib.resources.dll
    ----------------------------------------
    System.Windows.Forms.resources
        程序集版本: 1.0.5000.0
        Win32 版本: 1.1.4322.573
        基本代码: file:///x:/windows/assembly/gac/system.windows.forms.resources/1.0.5000.0_zh-chs_b77a5c561934e089/system.windows.forms.resources.dll
    ----------------------------------------************** JIT 调试 **************
    计算机的配置文件(machine.config)的 
     system.windows.forms 节中必须设置 jitDebugging 值。
    编译应用程序时还必须启用\r\n调试。\r\n\r\n例如: \r\n\r\n<configuration>\r\n    <system.windows.forms jitDebugging="true" />\r\n</configuration>\r\n\r\n启用 JIT 调试后,任何未处理的异常\r\n都将被发送到此计算机上注册的 JIT 调试器,\r\n而不是由此对话框处理。\r\n-------------------------------------------
    还是没有办法