苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4510|回复: 9

[其他] 请问为什么我这两段代码会卡呢?

[复制链接]
发表于 2014-1-23 18:32:54 | 显示全部楼层 |阅读模式
aaaa.png
bbbb.png

winfrom程序 用两个usercontrols控件做了两个界面,从A界面双击datagridview 然后显示出B界面,再从B界面中点击按钮返回上一级,也就是A界面,这样回来点几次就发现会很卡了,不知为什么?是不是代码有问题呢?谢谢
A界面的代码
[C#] 纯文本查看 复制代码
 private void dataGridViewX1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex > -1)
            {
               string _className=dataGridViewX1.Rows[e.RowIndex].Cells[1].Value.ToString();
               panelEx1.Controls.Clear();
               UserArticle article = new UserArticle(_className);
               article.Dock = DockStyle.Fill;
               panelEx1.Controls.Add(article);
               article.Show();
            }
        }


B界面的代码
[C#] 纯文本查看 复制代码
 private void btnBack_Click(object sender, EventArgs e)
        {
            panelEx1.Controls.Clear();
            UserAllArticle all = new UserAllArticle();
            all.Dock = DockStyle.Fill;
            panelEx1.Controls.Add(all);
            all.Show();
           
        }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-1-24 10:00:31 | 显示全部楼层
你这样写和写在方法里面有什么区别吗?我的意思是你只New一次,
[C#] 纯文本查看 复制代码
  public UserArticle article = null;
    private object SetNew(string _className)
    {
        if (article != null)
        {
            return article;

        }
        article = new UserArticle(_className);
        article.Dock = DockStyle.Fill;
        article.Show();
    }
    private void dataGridViewX1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex > -1)
        {
            string _className = dataGridViewX1.Rows[e.RowIndex].Cells[1].Value.ToString();
            panelEx1.Controls.Clear();
            panelEx1.Controls.Add(SetNew(_className));

        }
    }


发表于 2014-1-23 20:19:34 | 显示全部楼层
  UserAllArticle all = new UserAllArticle();
UserArticle article = new UserArticle(_className);你一直在New对象,就是不关闭,我估计是内存吃光了吧
 楼主| 发表于 2014-1-23 22:04:50 | 显示全部楼层
站长苏飞 发表于 2014-1-23 20:19
UserAllArticle all = new UserAllArticle();
UserArticle article = new UserArticle(_className);你 ...

但如果我改成using 这样 就显示不出来界面了
[C#] 纯文本查看 复制代码
  using (UserArticle article = new UserArticle(_className))
               {
                   article.Dock = DockStyle.Fill;
                   panelEx1.Controls.Add(article);
                   article.Show(); 
               }
 楼主| 发表于 2014-1-23 22:18:58 | 显示全部楼层
站长苏飞 发表于 2014-1-23 20:19
UserAllArticle all = new UserAllArticle();
UserArticle article = new UserArticle(_className);你 ...

因为UserArticle我是用UserAllArticle的panel显示的,panelEx1.Controls.Add(article) , using后释放了UserArticle,panel.controls里面也就没有对象了 所以没显示出来  有解决方法吗飞哥
发表于 2014-1-24 07:11:44 | 显示全部楼层
谁说叫你用using了,定义成public不就行了,只要不一直new就好
 楼主| 发表于 2014-1-24 09:47:04 | 显示全部楼层
站长苏飞 发表于 2014-1-24 07:11
谁说叫你用using了,定义成public不就行了,只要不一直new就好

飞哥的意思是定义成全局变量吗?像这样   
  public UserAllArticle all = null;
        private void btnBack_Click(object sender, EventArgs e)
        {
            panelEx1.Controls.Clear();
            all = new UserAllArticle();
            all.Dock = DockStyle.Fill;
            panelEx1.Controls.Add(all);
            all.Show();
       }


public UserArticle article = null;
        private void dataGridViewX1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex > -1)
            {
                string _className = dataGridViewX1.Rows[e.RowIndex].Cells[1].Value.ToString();
                panelEx1.Controls.Clear();
                article = new UserArticle(_className);
                panelEx1.Controls.Add(article);

                article.Dock = DockStyle.Fill;

                article.Show();
}

但依然没效果,还是卡,
 楼主| 发表于 2014-1-24 12:10:48 | 显示全部楼层
站长苏飞 发表于 2014-1-24 10:00
你这样写和写在方法里面有什么区别吗?我的意思是你只New一次,
[C#] 纯文本查看 复制代码
  public UserA ...[/quote]

试过了飞哥的代码 也是不行,我之前的写法也是只new一次嘛, 每次进入事件就会new一次,执行完事件系统不是会回收垃圾的吗,估计卡不是new的原因吧,好像是界面布局的问题,我的界面是用一个From窗体加上几个UserControl控件,在From窗体点击不同的按钮就会在From的panel里显示出不同的UserControl界面,例如From的代码是这样的:
       //From窗体的点击按钮事件
      private void buttonX2_Click(object sender, EventArgs e)
        {
           //这个是From的panelEx1
            panelEx1.Controls.Clear();
           //UserControls控件
            UserArticle test = new UserArticle();
            test.Dock = DockStyle.Fill;
            panelEx1.Controls.Add(test);
            test.Show();
        }
这样点来点去 也没发现会卡,我估计问题是出在UserArticle和UserAllArticle两个UserControls控件上

UserAllArticle是通用From窗体按钮点击事件在From的panel里显示出来的,UserArticle是通用UserAllArticle里的双击事件在UserAllArticle的panel里显示出来的,UserArticle里有个按钮用来返回上一级的界面(也就是UserAllArticle),我估计问题出在这里 ,
UserArticle的代码:
   [mw_shl_code=csharp,true] public UserAllArticle all = null;
        private object SetNew()
        {
            all = new UserAllArticle();
            all.Dock = DockStyle.Fill;
            all.Show();
            return all;
        }
         //UserArticle的按钮点击事件,用来显示上一级的界面
        private void btnBack_Click(object sender, EventArgs e)
        {
         //UserArticle的panel
            panelEx1.Controls.Clear();
            panelEx1.Controls.Add((Control)SetNew());
         }


UserAllArticle的代码:
[C#] 纯文本查看 复制代码
     public UserArticle article = null;
        private object SetNew(string _className)
        {
            //if (article != null)
            //{
               

            //}
            article = new UserArticle(_className);
            article.Dock = DockStyle.Fill;
            article.Show();
            return article;
        }
        private void dataGridViewX1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex > -1)
            {
                string _className = dataGridViewX1.Rows[e.RowIndex].Cells[1].Value.ToString();
                panelEx1.Controls.Clear();
                panelEx1.Controls.Add((Control)SetNew("111"));
            }
        }


这样从UserAllArticle点击进入UserArticle 再从UserArticle点击返回到UserAllArticle,这样回来点击几次,再点击回UserArticle的时候发现有点卡了,最明显的是这个时候把程序全屏显示,就会发现UserArticle在panel里一直闪烁好多次 最后才跟着全屏。
发表于 2014-1-24 17:17:42 | 显示全部楼层
站长苏飞 发表于 2014-1-24 10:00
你这样写和写在方法里面有什么区别吗?我的意思是你只New一次,
[mw_shl_code=csharp,true]  public UserA ...

private object SetNew(string _className)
  {
      if (article != null)
      {
          return article;

      }

_className是在变化的,这样做不行啊
发表于 2014-1-24 17:19:11 | 显示全部楼层
1161748579 发表于 2014-1-24 17:17
private object SetNew(string _className)
  {
      if (article != null)

这只是一种思路,想具体用,还得自己加代码,可以使用反射,加载就OK了
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2025-1-4 12:49

© 2014-2021

快速回复 返回顶部 返回列表