【问题标题】:How to modify and extend the gridview that using datasource?如何修改和扩展使用数据源的gridview?
【发布时间】:2017-05-14 14:53:17
【问题描述】:

我在 c# 中设置了一个带有数据表 "calculation" 的数据集,"calculation" 内有 4 个数据列 ID, Name, Area, Length 。现在我想扩展显示 "calculation" 作为数据源的网格视图,数据表有 4 个数据列,现在我想在网格视图中再显示一个 Volume将面积和长度相乘。

Calculation.Rows.Add(1, "Room", 102.32, 1312.8);
this.gridView1.GridControl.DataSource = Calculation;

我还想在gridview中隐藏面积和长度显示,只显示ID、名称和体积。

【问题讨论】:

  • 您的目标是什么:Winforms、WPF、ASP..? 总是正确标记您的问题!
  • 对不起,我正在寻找winforms的解决方案。

标签: c# winforms visual-studio gridview datatable


【解决方案1】:

对于其他数据,我将通过添加一个附加列将您要显示的数据添加到数据表中。这使得它更容易在网格中使用。

为了显示列的子集,我建议您手动创建要查看的列,并忽略不想看到的列或将 visibile 设置为 false。后者的优点是您可以让程序员或稍加努力的用户选择要查看的列。

一些示例代码,用简单的地址数据填充网格,因为我没有足够的信息来处理您的数据定义:

手动创建表格

        var table = new DataTable {TableName = "AddressData"};

        // Declare DataColumn and DataRow variables.

        // Create new DataColumns, set DataType, ColumnName and add to DataTable.    
        // Create Addressee column.
        var column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Addressee" };
        table.Columns.Add(column);

        // Create Address1 column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Address1" };
        table.Columns.Add(column);

        // Create Address2 column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Address2" };
        table.Columns.Add(column);

        // Create CityOrTown column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "CityOrTown" };
        table.Columns.Add(column);

        // Create Country column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Country" };
        table.Columns.Add(column);

        // Create CountryId column.
        column = new DataColumn { DataType = Type.GetType("System.Int64"), ColumnName = "CountryId" };
        table.Columns.Add(column);

        // Create CountyOrState column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "CountyOrState" };
        table.Columns.Add(column);

        // Create Postcode column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Postcode" };
        table.Columns.Add(column);

        // Create Formatted Address column.
        column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "FormattedAddress" };
        table.Columns.Add(column);

创建表格后,您可以随意填充它。或者,您可以简单地从数据库中返回包含计算列的表。

手动创建列

    private void Prepare()
    {
        // Set up the grid
        AutoGenerateColumns = false;
        Columns.Clear();

        AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

        var column = new DataGridViewTextBoxColumn
                         {
                             AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
                             DataPropertyName = "Addressee",
                             DefaultCellStyle = CellStyles.Text,
                             HeaderText = @"Addressee",
                             Name = "AddresseeColumn",
                         };

        Columns.Add(column);

        // more columns added here to suit

        // Add invisible Id column
        var idColumn = new DataGridViewTextBoxColumn
                           {
                               DataPropertyName = "CountryId",
                               Name = "CountryIdColumn",
                               HeaderText = @"Id",
                               Width = 0,
                               Visible = false
                           };

        Columns.Add(idColumn);

    }

将每列的 DataPropertyName 设置为您希望在表中显示的列名。 AutoSize 设置会导致网格中的任何空闲空间自动分配给具有该设置的列。如果您将其设置在多个列上,它们会自动调整,例如如果您有 90 像素的备用空间和 AutoSize 设置为 Fill 的三列,则每列将添加 30 像素。

请注意,您也可以从任何 Enumerable 对象中使用完全相同的技术,例如自定义数据对象的列表或数组。在上面的示例地址中,您可以使用地址列表而不是数据表来填充网格。

如果您采用该选项,您可以在对象中包含计算的值并避免创建表的工作。如果您已经有合适的对象并从数据库中填充它们,这将非常有用。

你有很多选择!

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

如果您有DataTable,则可以使用DataColumnExpression 属性来获取“面积”和“长度”列的乘积。下面的代码创建了一个名为“Volume”的新DataColumn,其中它的Expression(第三个参数)是“面积”和“长度”列中值的乘积。

创建列后,只需将其添加到表中即可。只是猜测这可能是您正在寻找的。​​p>

DataColumn dc = new DataColumn("Volume", typeof(float), "Area * Length");
Calculation.Columns.Add(dc);

【讨论】:

  • 感谢您的帮助。
  • DataColumn dc = new DataColumn("Volume", typeof(float), "Area * Length"); 对于第三次重载,我可以创建一个新函数并修改数据返回吗?
  • 如果我理解正确,是的,您可以将 Expression 字符串更改为任何合法表达式。该表达式有些受限,但在某些情况下可能非常有用。以下链接指向表达式属性的 MSDN 文档页面。您可能会发现它很有用。 DataColumn.Expression Property
  • 再次感谢,我已通读您提供的文档,但似乎仅限于框架提供的某些功能。有没有什么地方可以创建一个新函数并调用它以返回某个值?
  • 如果不知道这个函数是做什么的或者它是如何实现的,很难说。我不会争辩,Expression 字符串有些限制,但是如果需要更复杂的过滤器/聚合/表达式,您可能需要查看“sql”。同样,如果没有更多信息,很难就该走哪条路给出一个有效的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2012-08-07
  • 2016-05-09
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多