【问题标题】:Controlling C# DataGridView with an Arraylist in VS2008在 VS2008 中使用 Arraylist 控制 C# DataGridView
【发布时间】:2008-11-25 21:18:38
【问题描述】:

我在 VS2008 中使用的 datagridview 元素有一些问题。 这个 DataGridView 实际上是 TabControl 元素中的一个选项卡。

我给了它 5 个列,这些列需要用我制作的服装对象中的元素填充。

它基本上是一个小型库应用程序,其中包含一个主类和几个从它派生的类。它们都有一个 ToString() 方法,它将数据表示为一个关键字字符串,其中包含我填充 datagridview 所需的值。

虽然我只需要前 5 个,但有些对象最多有 12 个关键字。 目前,每当我添加一个对象时,datagrid 不会自行填充,而是添加与特定对象具有的关键字数量相等的列数。

我目前正在做的是:

public void libDataGrid_Click(object sender, EventArgs e)
        {
            if(this.manager.Lib.LibList[0] != null)
            {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
            }
        }

this.manager.Lib.LibList 返回和 ArrayList,其中存储了所有对象。 ArrayList 可以包含所有派生类的元素,但由于它们都是连接的,因此字符串表示将始终包含填充网格所需的元素。

我不明白如何只过滤前五个并且他们将它们放入正确的列中。

还有一件事。目前我只能通过单击来刷新 DataGridView。当我切换到我的意思是切换到 Tabcontrol 上的特定选项卡时,它应该会打开。

我尝试为 SelectedIndexChanged 添加一个参数,但实际上并没有什么作用...... 或者至少,它似乎没有做任何事情。

我的意思是我注释掉了上面的代码并添加了这个:

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

每次更改选项卡时都会刷新它,无论是哪个选项卡。 我不得不删除 if 语句,因为它给了我一个例外。可能是因为初始化时没有设置 ArrayList 的长度。

【问题讨论】:

    标签: c# winforms visual-studio-2008 datagridview tabcontrol


    【解决方案1】:

    我对这个问题有点困惑,但这里有一些想法:

    1. DataGridView 有一个 AutoGenerateColumns 属性;如果您不希望它创建自己的列,请将其设置为 false
    2. 要绑定到现有列,必须在每个列上设置 DataPropertyName
    3. DataGridView(在 cmomon 中使用 TypeDescriptor 的任何列表控件)将非常喜欢 List<T>(对于某些 T != object)到 ArrayList,因为即使对于空列表,它也可以获得元数据.一般来说,在 2.0 中使用ArrayList 是一个错误。

    【讨论】:

      【解决方案2】:

      我只能给出部分答案,但我认为原因

      public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
              {
                      libDataGrid.DataSource = this.manager.Lib.LibList;
                      libDataGrid.Refresh();
              }
      

      不起作用,是因为您需要在初始化 tabControl1 的位置添加这一行。我遇到过这个问题,VS 自己不会这样做。

      tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged);
      

      【讨论】:

        【解决方案3】:

        如果我理解您的问题,这似乎与我最近在 DataGridViews in C#/.NET2.0 的此线程中遇到的问题相似

        尝试调用:

        libDataGrid.Invalidate();
        

        这应该会强制 Windows 重新绘制您的控件。无需重新附加数据源并刷新。 (我认为您可以放心地注释掉这两行。)

        另外:您得到的异常是什么?

        您是否使用“数据源配置向导”来帮助您使用 dataGridView?

        【讨论】:

        • 异常是 ArgumentOutOfRangeException
        • 我尝试了配置向导,但这只是为了让我选择构造函数,它包含的不仅仅是 ArrayList。
        • 好的,值得一试。祝你好运!
        猜你喜欢
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 2014-12-05
        相关资源
        最近更新 更多