【问题标题】:how to avoid rebinding grid each time the control is initialized?每次初始化控件时如何避免重新绑定网格?
【发布时间】:2011-12-02 16:29:49
【问题描述】:

我创建了一个带有网格的自定义用户控件。我想绑定这个网格一次,并在我的应用程序中一遍又一遍地使用它。如果我将绑定放在控件中,则数据的检索次数与我使用控件的次数一样多。如何只绑定一次??

public ClientLookUp()
    {
        InitializeComponent();
        vw_clientsTableAdapter.Fill(dsclientlkup.vw_clients); //This occurs as many times as I have the user control, instead of just once.

    }

【问题讨论】:

  • 那不是函数,是构造函数(没有返回类型)

标签: c# winforms gridview


【解决方案1】:

你在构造函数中的任何东西都会在你每次构造对象时被执行! 提供一个可以在需要重新加载数据时调用的 Initialize 方法怎么样?

【讨论】:

    【解决方案2】:

    如果您只想加载一次数据,请将其加载到静态变量或控件引用的单独类中。

    【讨论】:

      【解决方案3】:

      如果您真的想要在您的控件中反复使用同一个网格,您可以创建一个单独的静态网格,并让您的 ClientLookUp 构造函数将其添加到正确的位置 - 面板,或其他任何东西——无论何时创建一个新的。

      然而,在你走这条路之前,问问自己这是否真的是你想要做的。在许多地方存在相同的网格可能会给您带来麻烦。如果您想支持网格内编辑,您会发现更改一个值会更改所有其他网格中的相同值..

      编辑

      我尝试让下面的代码工作,但我不确定这种方法是否可行。似乎当您尝试将相同的 UI 元素附加到多个位置时,它就会移出您放置它的最后一个位置;看起来您不能同时在多个地方拥有相同的网格。仔细想想,这是有道理的。

      这是我尝试过的代码。或许对你有些用处。

          public UserControl1()
          {
              InitializeComponent();
      
              this.Controls.Add(myStaticGridView);
              myStaticGridView.Dock = DockStyle.Fill;
          }
      
          static DataGridView _staticGrid;
          public DataGridView myStaticGridView
          {
              get
              {
                  if (_staticGrid != null)
                      return _staticGrid;
      
                  _staticGrid = new DataGridView();
                  _staticGrid.Columns.Add("A", "A");
                  _staticGrid.Columns.Add("B", "B");
                  _staticGrid.Columns.Add("C", "C");
      
                  _staticGrid.Columns[0].DataPropertyName = "A";
                  _staticGrid.Columns[1].DataPropertyName = "B";
                  _staticGrid.Columns[2].DataPropertyName = "C";
      
                  _staticGrid.DataSource = new[] {
                      new { A = "someA", B = "someB", C = "someC"},
                      new { A = "someA", B = "someB", C = "someC"},
                      new { A = "someA", B = "someB", C = "someC"},
                      new { A = "someA", B = "someB", C = "someC"},
                  };
      
                  return _staticGrid;
              }
          }
      

      然后像这样加载控件:

          private void button1_Click(object sender, EventArgs e)
          {
              flowLayoutPanel1.Controls.Add(new UserControl1());
          }
      

      【讨论】:

      • 这不是真正的网格;这是一个下拉列表,其中包含我需要在应用程序的许多页面上使用的客户端列表。它永远不会改变或更新。我认为最好的方法是创建一个自定义控件,然后将它放在我需要的任何地方。我曾希望避免单独绑定每一个。
      • 同样的原则也适用。如果您要在许多地方使用此下拉菜单,那么一定要缓存他们都使用的 data,但要尝试缓存实际的下拉菜单并使用 that在许多地方,弊大于利——假设甚至有可能
      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多