datagridview 使用虚拟模式后,如何实现点击列标题的排序功能

时间:2021-03-20 17:27:50
datagridview 使用虚拟模式后,点击列标题的排序功能就失效了。

怎么能在使用虚拟模式的同时,显示点击列标题后排序的功能??

5 个解决方案

#1


自顶

#2


顶,我也有同樣的問題

#3


估计是不能解决的问题。。。。

#4


使用虚拟模式后,列标题的排序功能就失效了。不要再试了

#5


还是可以实现的,但需要认为实现。通过DataView来实
DataView dv = DataTable.DefaultView //获取数据视图
通过dv.Sort方式来实现排序
在CellValueNeeded事件中加载视图的数据
e.Value = dv[e.RowIndex]["列"]
通过ColumnHeaderMouseClick事件来处理列标头的样式

参考代码

//我的DataGridView一共8列,第一列为序号列无需排序
void dgvList_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
     if (this.dv.Table == null)
         return;

     if (this.dv.Table.Rows.Count > 0)
     {
         switch (e.ColumnIndex)
         {
             case 0:
                 break;
             case 1:
                 this.ColumnHeaderOperate(this.dgvList.Columns[1].HeaderCell, "gdkh", 1);
                 break;
             case 2:
                 this.ColumnHeaderOperate(this.dgvList.Columns[2].HeaderCell, "gdxm", 2);
                 break;
             case 3:
                 this.ColumnHeaderOperate(this.dgvList.Columns[3].HeaderCell, "cyltggs", 3);
                 break;
             case 4:
                 this.ColumnHeaderOperate(this.dgvList.Columns[4].HeaderCell, "zzltgbbl", 4);
                 break;
             case 5:
                 this.ColumnHeaderOperate(this.dgvList.Columns[5].HeaderCell, "yybmc", 5);
                 break;
             case 6:
                 this.ColumnHeaderOperate(this.dgvList.Columns[6].HeaderCell, "yybdz", 6);
                 break;
             case 7:
                 this.ColumnHeaderOperate(this.dgvList.Columns[7].HeaderCell, "yyblxdh", 7);
                 break;
             default:
                 break;
         }
     }
}

/// <summary>
/// 处理列表头点击排序
/// </summary>
/// <param name="dgvColumnHeader">控件列表头</param>
/// <param name="strColumnName">列的名称</param>
/// <param name="nIndex">列的索引</param>
private void ColumnHeaderOperate(DataGridViewColumnHeaderCell dgvColumnHeader, string strColumnName, int nIndex)
{
     switch (dgvColumnHeader.SortGlyphDirection)
     {
          case SortOrder.None:
               this.dv.Sort = strColumnName;
               dgvColumnHeader.SortGlyphDirection = SortOrder.Ascending;
               break;
          case SortOrder.Ascending:
               this.dv.Sort = strColumnName + " DESC";
               dgvColumnHeader.SortGlyphDirection = SortOrder.Descending;
               break;
          case SortOrder.Descending:
               this.dv.Sort = strColumnName;
               dgvColumnHeader.SortGlyphDirection = SortOrder.Ascending;
               break;
          default:
               break;
     }

     //一共8列,除了排序列,别的列标头恢复原始状态
     for (int i = 0; i < 8; i++)
     {
          if (i != nIndex)
          {
              this.dgvList.Columns[i].HeaderCell.SortGlyphDirection = SortOrder.None;
          }
     }

     this.dgvList.RowCount = this.dv.Table.Rows.Count;
     this.dgvList.Refresh();
}

#1


自顶

#2


顶,我也有同樣的問題

#3


估计是不能解决的问题。。。。

#4


使用虚拟模式后,列标题的排序功能就失效了。不要再试了

#5


还是可以实现的,但需要认为实现。通过DataView来实
DataView dv = DataTable.DefaultView //获取数据视图
通过dv.Sort方式来实现排序
在CellValueNeeded事件中加载视图的数据
e.Value = dv[e.RowIndex]["列"]
通过ColumnHeaderMouseClick事件来处理列标头的样式

参考代码

//我的DataGridView一共8列,第一列为序号列无需排序
void dgvList_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
     if (this.dv.Table == null)
         return;

     if (this.dv.Table.Rows.Count > 0)
     {
         switch (e.ColumnIndex)
         {
             case 0:
                 break;
             case 1:
                 this.ColumnHeaderOperate(this.dgvList.Columns[1].HeaderCell, "gdkh", 1);
                 break;
             case 2:
                 this.ColumnHeaderOperate(this.dgvList.Columns[2].HeaderCell, "gdxm", 2);
                 break;
             case 3:
                 this.ColumnHeaderOperate(this.dgvList.Columns[3].HeaderCell, "cyltggs", 3);
                 break;
             case 4:
                 this.ColumnHeaderOperate(this.dgvList.Columns[4].HeaderCell, "zzltgbbl", 4);
                 break;
             case 5:
                 this.ColumnHeaderOperate(this.dgvList.Columns[5].HeaderCell, "yybmc", 5);
                 break;
             case 6:
                 this.ColumnHeaderOperate(this.dgvList.Columns[6].HeaderCell, "yybdz", 6);
                 break;
             case 7:
                 this.ColumnHeaderOperate(this.dgvList.Columns[7].HeaderCell, "yyblxdh", 7);
                 break;
             default:
                 break;
         }
     }
}

/// <summary>
/// 处理列表头点击排序
/// </summary>
/// <param name="dgvColumnHeader">控件列表头</param>
/// <param name="strColumnName">列的名称</param>
/// <param name="nIndex">列的索引</param>
private void ColumnHeaderOperate(DataGridViewColumnHeaderCell dgvColumnHeader, string strColumnName, int nIndex)
{
     switch (dgvColumnHeader.SortGlyphDirection)
     {
          case SortOrder.None:
               this.dv.Sort = strColumnName;
               dgvColumnHeader.SortGlyphDirection = SortOrder.Ascending;
               break;
          case SortOrder.Ascending:
               this.dv.Sort = strColumnName + " DESC";
               dgvColumnHeader.SortGlyphDirection = SortOrder.Descending;
               break;
          case SortOrder.Descending:
               this.dv.Sort = strColumnName;
               dgvColumnHeader.SortGlyphDirection = SortOrder.Ascending;
               break;
          default:
               break;
     }

     //一共8列,除了排序列,别的列标头恢复原始状态
     for (int i = 0; i < 8; i++)
     {
          if (i != nIndex)
          {
              this.dgvList.Columns[i].HeaderCell.SortGlyphDirection = SortOrder.None;
          }
     }

     this.dgvList.RowCount = this.dv.Table.Rows.Count;
     this.dgvList.Refresh();
}