【问题标题】:C# Windows Form application mdi child form rendering takes too much timeC# Windows Form 应用程序 mdi 子窗体渲染耗时太长
【发布时间】:2018-03-25 16:09:00
【问题描述】:

我的表单中有多个 gridview,其中一个 gridview 行是根据数据绘制的。

但是当我加载表单时它看起来很奇怪,就像控件在表单上没有正确呈现一样。

请查看at this video 以获得更好的理解:

【问题讨论】:

  • 如果可以的话,你能换成DatagridView吗?
  • 我只使用datagridview。 :)
  • 有什么问题?什么看起来很奇怪?
  • @NoSaidTheCompiler 请看我在链接中提到的视频。

标签: c# winforms performance


【解决方案1】:

从视频中我可以理解的是加载需要时间,

如果您在 Load Method 上编写了 ADO.NET(从 DB 获取数据),则需要一些时间来获取和显示它们。

我建议您在加载期间使用单独的线程(对于每个 Grid)来获取数据,以优化性能。

【讨论】:

  • 我也测量了时间。表单加载事件函数需要 2500-2700 毫秒。但无法弄清楚这种奇怪的加载效果的原因。 ://
  • 根据我的经验,这也取决于机器的配置
  • datagridview 控件可以轻松处理数百万行数据...我看不出机器配置背后的逻辑 :)
【解决方案2】:

我不确定这是否能完全解决您的问题,但这里有一些提示/技巧:

! .如果您要更新Datagridview 源,请在更新数据源之前尝试将AutoSizeColumnsMode 设置为无。这已被证明有效。

2 。有一个属性叫做DoubleBuffer。我不会深入研究它的描述,但简单来说,它会帮助你显着提高你的性能:)

static class ExtensionMethods
{
public void DoubleBuffered(DataGridView dgv, bool setting)
{
    Type dgvType = dgv.GetType();
    PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
    pi.SetValue(dgv, setting, null);
}
}
  ExtensionMethods.DoubleBuffered(mydgvw, True);

3 .最后但同样重要的是,当在 dgvw 中显示来自数据源的数据时,有时使用 ObserveableCollection 之类的集合会很有帮助,或者如果可能,尝试通过过滤减少显示的数据量。

4 .在DataAdapter 上使用DataReader 明显更快。创建一个类来管理您的数据,使用DataReader 而不是DataAdapter/DataTable。例如

 public class Employees
{
    private int age;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private int id;

    public int Id
    {
        get { return id; }
        set { id = value; }
       } 
    }

  ///create an array

 ArrayList myData = new ArrayList();

 ///Now,let ur datareader do the job for you .

 while (reader.Read())
           {
               Employees emp = new Employees();
               emp.Id = (int)reader[0];
               emp.Name = reader[1].ToString();
               emp.Age = (int)reader[2];
               myData.Add(m);
           }
           dataGridView1.DataSource = myData;

4 .另一个最好的选择是,如果你使用Datareader 并按照上面的代码,确保在主窗体加载时在后台运行它,然后在按钮点击时,只需将dataGridView.DataSource 设置为数组......

这些是基础知识,但希望它们对您有所帮助:)

【讨论】:

  • 我尝试了您的建议,但遗憾的是我认为它不起作用。还是同样的问题。
  • 我真的没有在你的视频中看到任何问题...你能解释一下吗?
  • 你有没有注意到当我点击“课程”时,显示表单需要多少时间,一旦表单开始加载,就会出现一个一个控件。
  • 如果你使用的是数据表,那是一个糟糕的选择,你在使用它吗?
  • 是的,这就是我从数据库加载数据的地方
猜你喜欢
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多