如何使 DataGridVewLinkColumn 与 DataGridView 的其余部分一起排序 [英] How make a DataGridVewLinkColumn sort with the rest of the DataGridView

查看:28
本文介绍了如何使 DataGridVewLinkColumn 与 DataGridView 的其余部分一起排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 DataTable 作为数据源填充了 DataGridView.这个数据源有一列带有注释.作为要求的一部分,我隐藏了此列,并添加了一个新的 DataGridVewLinkColumn,当​​用户点击该列时,将能够看到该评论.

I populated a DataGridView with a DataTable as DataSource. This DataSource has a column with comments in it. I hide this column as part of the requirements and added a new DataGridVewLinkColumn that when is clicked the user will be able to see that comment.

我的问题是,当我通过单击 DataGridView 中的任何标题进行排序时,所有 DataGridViewLinkColumn 链接都消失了.我已在此 LinkColumn 中将 SortMode 设置为 Automatic,但似乎我需要做其他事情,因为只要我点击网格中其他列的标题,链接就会消失.

My problem is when I sort by clicking on any of the headers from the DataGridView, all the DataGridViewLinkColumn links disappear. I have set the SortMode to Automatic in this LinkColumn but seems that I need to do something else because still as soon as I click on the headers from the other columns in the Grid the links disappear.

有人知道我如何确保在对 DataGridView 进行排序时,链接列也得到相应的排序吗?

Any one knows how can I make sure that when the DataGridView is sorted the link column gets sorted accordingly?

非常感谢

好的,我想通了.问题是因为我使用了 DataTable 作为 DataSource 它被绑定到网格,并且无法向已经绑定的网格源添加额外的列并期望它将与源绑定.为了解决这个问题,我只是修改了数据表.使用将作为 DataGridView 中的链接的字符串在数据表中添加额外的列,并按照 http://msdn.microsoft.com/en-us/library/bxt3k60s(v=vs.90).aspx

OK I figure it out. The problem is because I used a DataTable as DataSource it was binded to the grid and there is no way to add an extra column to a grid source that is already binded and expect that it will bind with the source. To solve this problem I just modified the data table. Add the extra column in the data table with the strings that will be the links in the DataGridView and populate the DataGridView programatically as recommended in http://msdn.microsoft.com/en-us/library/bxt3k60s(v=vs.90).aspx

推荐答案

Windows 窗体 DataGridView 控件中的列排序模式

对同时包含绑定列和未绑定列的 DataGridView 控件进行排序时,无法自动维护未绑定列中的值.要维护这些值,您必须通过将 VirtualMode 属性设置为 true 并处理 CellValueNeeded 和 CellValuePushed 事件来实现虚拟模式.

When a DataGridView control containing both bound and unbound columns is sorted, the values in the unbound columns cannot be maintained automatically. To maintain these values, you must implement virtual mode by setting the VirtualMode property to true and handling the CellValueNeeded and CellValuePushed events.

这有点复杂,所以最简单的解决方案是在您的数据表中添加一个额外的列.

This is a bit complicated, so the simplest solution would be to add an extra column into your DataTable.

我将在下面留下一个示例以供将来参考.

I'll leave an example below for future reference.

要点是:

  • VirtualMode 应该是 true.
  • CellValueNeeded 应该正确处理以显示指定的单元格值.
  • ColumnHeaderMouseClick 应正确处理以按未绑定的列排序并显示排序字形.
  • VirtualMode should be true.
  • CellValueNeeded should be handled properly to show the specified cell values.
  • ColumnHeaderMouseClick should be handled properly to sort by the unbound columns, and to show sort glyphs.

注意:

  • 本示例中的 DataGridView 是只读的,以简化操作.

此示例表单包含:

  • 一个类型化的数据集,它具有 DataTable1ID(string), Comment(string) 列:

  • A typed DataSet, that has DataTable1 with columns of ID(string), Comment(string):

private DataSet1 dataSet1;

  • 绑定源:

  • A BindingSource:

    private BindingSource dataTable1BindingSource;
        .DataMember = "DataTable1";
        .DataSource = this.dataSet1;
    

  • 数据网格视图:

  • A DataGridView:

    private DataGridView dataTable1DataGridView;
        .DataSource = this.dataTable1BindingSource;
        .VirtualMode = true;
        .CellValueNeeded += this.dataTable1DataGridView_CellValueNeeded;
        .ColumnHeaderMouseClick += this.dataTable1DataGridView_ColumnHeaderMouseClick;
        .ReadOnly = true;
        .AllowUserToAddRows = false;
        .AllowUserToDeleteRows = false;
    

  • 它的列:

  • Its columns:

    private DataGridViewTextBoxColumn iDDataGridViewTextBoxColumn;      // bound column
    private DataGridViewTextBoxColumn commentDataGridViewTextBoxColumn; // bound column
    private DataGridViewLinkColumn linkColumn;                          // unbound column
        .SortMode = DataGridViewColumnSortMode.Automatic;
    

  • 代码如下:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        // Hold the link texts, in a dictinary
        // keyed by ID (= unique key in DataTable1), to be bound to each row.
        private SortedDictionary<string, string> _linkTexts
            = new SortedDictionary<string, string>();
    
        private void Form1_Load(object sender, EventArgs e)
        {
            // Bound data sample
            this.dataSet1.DataTable1.AddDataTable1Row("1", "Comment1");
            this.dataSet1.DataTable1.AddDataTable1Row("2", "Comment2");
            this.dataSet1.DataTable1.AddDataTable1Row("3", "Comment3");
    
            // Unbound data sample
            this._linkTexts.Add("1", "linkA");
            this._linkTexts.Add("2", "linkC");
            this._linkTexts.Add("3", "linkB");
        }
    
        // Handles ColumnHeaderMouseClick to do custom sort.
        private void dataTable1DataGridView_ColumnHeaderMouseClick(
            object sender, DataGridViewCellMouseEventArgs e)
        {
            // When the unbound column header is clicked,
            if (e.ColumnIndex == this.linkColumn.Index)
            {
                // Create a new DataView sorted by the link text
                // with toggling the sort order.
                DataView newView;
                switch (this.linkColumn.HeaderCell.SortGlyphDirection)
                {
                    case SortOrder.None:
                    case SortOrder.Descending:
                        this.linkColumn.HeaderCell.SortGlyphDirection
                            = SortOrder.Ascending;
                        newView = this.dataSet1.DataTable1
                            .OrderBy(row => this._linkTexts[row.ID])
                            .AsDataView();
                        break;
    
                    default:
                        this.linkColumn.HeaderCell.SortGlyphDirection
                            = SortOrder.Descending;
                        newView = this.dataSet1.DataTable1
                            .OrderByDescending(row => this._linkTexts[row.ID])
                            .AsDataView();
                        break;
                }
    
                // Set it as DataSource.
                this.dataTable1BindingSource.DataSource = newView;
    
                // Clear sort glyphs on the other column headers.
                foreach (DataGridViewColumn col
                         in this.dataTable1DataGridView.Columns)
                {
                    if (col != this.linkColumn)
                        col.HeaderCell.SortGlyphDirection = SortOrder.None;
                }
            }
            // The bound column header is clicked,
            else
            {
                // Sorting has done automatically.
                // Reset the sort glyph on the unbound column.
                this.linkColumn.HeaderCell.SortGlyphDirection = SortOrder.None;
            }
        }
    
        // Handles CellValueNeeded to show cell values in virtual mode.
        private void dataTable1DataGridView_CellValueNeeded(
            object sender, DataGridViewCellValueEventArgs e)
        {
            // Extract the bound row from the current data view.
            DataSet1.DataTable1Row row
                = (this.dataTable1BindingSource[e.RowIndex] as DataRowView)
                  .Row as DataSet1.DataTable1Row;
    
            // For the unbound column,
            if (e.ColumnIndex == this.linkColumn.Index)
            {
                if (row.IsIDNull())
                    e.Value = DBNull.Value;
                else
                    // get the value from the dictionary.
                    e.Value = this._linkTexts[row.ID];
            }
            // For the bound columns,
            else
            {
                // get the value from the data source.
                string propName = this.dataTable1DataGridView
                                  .Columns[e.ColumnIndex].DataPropertyName;
                e.Value = row[propName];
            }
        }
    }
    

    这篇关于如何使 DataGridVewLinkColumn 与 DataGridView 的其余部分一起排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆