实现类似Windows资源管理器的DataGrid

原创 2003年11月04日 01:30:00

在DataGrid中,我们可以实现类似Windows资源管理器的效果,即对列进行排序,该列颜色与其它列不同。下面就是实现的代码:

DataGridLikeWindowsExplorer.aspx

<%@ Page language="c#" Codebehind="DataGridLikeWindowsExplorer.aspx.cs"
 AutoEventWireup
="false" Inherits="aspxWebCS.DataGridLikeWindowsExplorer" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
    
<title>DataGridLikeWindowsExplorer</title>
    
<meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
    
<meta name="CODE_LANGUAGE" Content="C#">
    
<meta name="vs_defaultClientScript" content="JavaScript">
    
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    
<style type="text/css">
  .gridtooltip 
{
   BORDER-RIGHT
: black 1px solid;
   PADDING-RIGHT
: 4px;
   BORDER-TOP
: black 1px solid;
   PADDING-LEFT
: 4px;
   Z-INDEX
: 200;
   LEFT
: 0px;
   VISIBILITY
: hidden;
   PADDING-BOTTOM
: 4px;
   FONT
: 9pt bold 宋体;
   BORDER-LEFT
: black 1px solid;
   WIDTH
: 150px;
   COLOR
: white;
   PADDING-TOP
: 4px;
   BORDER-BOTTOM
: black 1px solid;
   POSITION
: absolute;
   TOP
: 0px;
   BACKGROUND-COLOR
: #ff3316
   
}
    
</style>
<!--{PS..1}-->
</HEAD>
<body MS_POSITIONING="GridLayout">
<asp:PlaceHolder ID="Tips_PlaceHolder" Runat="server"></asp:PlaceHolder>
<form id="DataGridLikeWindowsExplorer" method="post" runat="server">
<div align="center">
<h4>Northwind职员表</h4>
<asp:DataGrid ID="WinExplorerView_DataGrid" Runat="server" BorderColor="#FF6600"
  BorderStyle
="None" BorderWidth="5px" BackColor="White" CellPadding="5" AllowSorting="True"
  AutoGenerateColumns
="False" AllowPaging="True" GridLines="Horizontal" PageSize="5">
  
<SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#669999"></SelectedItemStyle>
  
<ItemStyle ForeColor="#000066"></ItemStyle>
  
<HeaderStyle Font-Bold="True" HorizontalAlign="Center" ForeColor="Navy" BackColor="#FFCC00"></HeaderStyle>
  
<FooterStyle ForeColor="#000066" BackColor="White"></FooterStyle>
  
<Columns>
    
<asp:BoundColumn DataField="LastName" SortExpression="LastName" HeaderText="姓"></asp:BoundColumn>
    
<asp:BoundColumn DataField="FirstName" SortExpression="FirstName" HeaderText="名字"></asp:BoundColumn>
    
<asp:BoundColumn DataField="Title" SortExpression="Title" HeaderText="职位"></asp:BoundColumn>
    
<asp:BoundColumn DataField="BirthDate" SortExpression="BirthDate" HeaderText="出生日期"
      DataFormatString
="{0:d}"/></asp:BoundColumn>
    
<asp:BoundColumn DataField="City" SortExpression="City" HeaderText="居住地"></asp:BoundColumn>
  
</Columns>
  
<PagerStyle HorizontalAlign="Left" ForeColor="#000066" BackColor="White" Mode="NumericPages"></PagerStyle>
</asp:DataGrid>
</div>
</form>
</body>
</HTML>

C#(DataGridLikeWindowsExplorer.aspx.cs):

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.Caching;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace aspxWebCS
{
/// <summary>
/// DataGridLikeWindowsExplorer 的摘要说明。
/// </summary>
public class DataGridLikeWindowsExplorer : System.Web.UI.Page
{
 
protected System.Web.UI.WebControls.DataGrid WinExplorerView_DataGrid;
 
protected System.Data.SqlClient.SqlDataAdapter m_sqlDataAdapter;
 
protected System.Data.SqlClient.SqlCommand m_sqlSelectCommand;
 
protected System.Data.SqlClient.SqlConnection m_sqlConnection;
 
protected System.Data.DataSet m_dsEmployees;
 
protected System.Data.DataView m_dvEmployees;
 
protected System.Collections.Hashtable colHeaderMap;

 
protected string m_strSortExpr;
 
protected string m_strSortOrder;
 
protected int m_iSortColumnIdx;
 
protected System.Web.UI.WebControls.PlaceHolder Tips_PlaceHolder;

 
protected string strConn = "Data Source=.;User Id=sa;Password=;Initial Catalog=Northwind;";

 
private void Page_Load(object sender, System.EventArgs e)
 {
  m_iSortColumnIdx 
= -1;
  m_strSortExpr 
= "";
  m_strSortOrder 
= "";
  ProcessViewState();
  PrepareColumnHeaderMap();

  
if (!IsPostBack)
  {
   BindGridToView();
  }
 }

 
private void PrepareColumnHeaderMap()
 {
  colHeaderMap 
= new Hashtable();
  
int idx = 0;
  
foreach (DataGridColumn col in WinExplorerView_DataGrid.Columns)
  {
   colHeaderMap[col.SortExpression] 
= idx++;
  }
 }

 
private void RetrieveData()
 {
  
if (null == Cache["EmployeesDS"])
  {
   
string tmp = "SELECT LastName, FirstName, Title, BirthDate, City FROM Employees";
   m_sqlConnection 
= new SqlConnection(strConn);
   m_sqlSelectCommand 
= new SqlCommand(tmp, m_sqlConnection);
   m_sqlDataAdapter 
= new SqlDataAdapter(m_sqlSelectCommand);
   m_dsEmployees 
= new DataSet("Employees");
   m_sqlDataAdapter.Fill(m_dsEmployees);
   Cache.Insert(
"EmployeesDS", m_dsEmployees, null, DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration);
  }
  
else
  {
   m_dsEmployees 
= (DataSet)Cache["EmployeesDS"];
  }
 }

 
private void ProcessViewState()
 {
  
if (null != ViewState["SortExpr"])
  {
   m_strSortExpr 
= ViewState["SortExpr"].ToString();
  }
  
if (null != ViewState["SortOrder"])
  {
   m_strSortOrder 
= ViewState["SortOrder"].ToString();
  }
 }

 
private void BindGridToView()
 {
  
string strSort = "";
  
if (0 != m_strSortExpr.Length)
  {
   strSort 
= m_strSortExpr;
   
if (0 != m_strSortOrder.Length)
   {
    strSort 
+= (" " + m_strSortOrder);
   }
  }
  RetrieveData();

  m_dvEmployees 
= new DataView(m_dsEmployees.Tables[0], "", strSort, DataViewRowState.CurrentRows);
  WinExplorerView_DataGrid.DataSource 
= m_dvEmployees;
  WinExplorerView_DataGrid.DataBind();
 }

 
private Color GetSortColumnColor()
 {
  
if (null == this.m_strSortOrder ||
   String.Empty 
== this.m_strSortOrder||
   
0 == this.m_strSortOrder.Length)
  {
   
return Color.Gold;
  }

  
if (m_strSortOrder.CompareTo("ASC"== 0)
  {
   
return Color.Gold;
  }
  
else
  {
   
return Color.BlanchedAlmond;
  }
 }

 
private void OnPageIndexChange(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
 {
  WinExplorerView_DataGrid.CurrentPageIndex 
= e.NewPageIndex;
  BindGridToView();
 }

 
private void OnSortView(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
 {
  m_strSortExpr 
= e.SortExpression;
  ViewState[
"SortExpr"= m_strSortExpr;

  
if (0 == m_strSortOrder.Length)
  {
   m_strSortOrder 
= "ASC";
  }
  
else if (m_strSortOrder.CompareTo("ASC"== 0)
  {
   m_strSortOrder 
= "DESC";
  }
  
else
  {
   m_strSortOrder 
= "ASC";
  }
  ViewState[
"SortOrder"= m_strSortOrder;
  
// 找到Click事件所在的列序号
  m_iSortColumnIdx = Convert.ToInt32(this.colHeaderMap[m_strSortExpr]);
  BindGridToView();
 }

 
private void OnItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
 {
  
if (e.Item.ItemType == ListItemType.Header)
  {
   
int idx = 0;
   
foreach (TableCell cl in e.Item.Cells)
   {
    cl.Attributes.Add(
"onmouseover""showheadertip(" + idx.ToString() + ");");
    cl.Attributes.Add(
"onmouseout""hideheadertip(" + idx.ToString() + ");");
    idx
++;
   }
  }
  
if (e.Item.ItemType == ListItemType.Item ||
   e.Item.ItemType 
== ListItemType.AlternatingItem)
  {
   
if (-1 != m_iSortColumnIdx)
   {
    e.Item.Cells[m_iSortColumnIdx].BackColor 
= GetSortColumnColor();
   }
  }
 }

 
protected override void OnPreRender(EventArgs e)
 {
  
///ToolTip文字
  int nCount = this.WinExplorerView_DataGrid.Columns.Count;
  
for (int i = 0; i < nCount; i++)
  {
   Panel pnl 
= new Panel();
   pnl.CssClass 
= "gridtooltip";
   pnl.ID 
= "htip" + i.ToString();
   Literal lt 
= new Literal();
   lt.Text 
= this.GetHeaderTooltipText(i);
   pnl.Controls.Add(lt);
   
this.Tips_PlaceHolder.Controls.Add(pnl);
  }
  
base.OnPreRender (e);
 }

 
private string GetHeaderTooltipText(int iColIdx)
 {
  
switch (iColIdx)
  {
   
case 0:
    
return "职员的姓";
   
case 1:
    
return "职员名字";
   
case 2:
    
return "职员的职位";
   
case 3:
    
return "出生日期";
   
case 4:
    
return "居住地";
   
default:
    
throw new ArgumentException("无效地列序号""Index");
  }
 }

#region Web Form Designer generated code
 
override protected void OnInit(EventArgs e)
 {
  InitializeComponent();
  
base.OnInit(e);
 }

 
private void InitializeComponent()
 {
  
this.WinExplorerView_DataGrid.ItemCreated +=
   
new System.Web.UI.WebControls.DataGridItemEventHandler(this.OnItemCreated);
  
this.WinExplorerView_DataGrid.PageIndexChanged +=
   
new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.OnPageIndexChange);
  
this.WinExplorerView_DataGrid.SortCommand +=
   
new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.OnSortView);
  
this.Load += new System.EventHandler(this.Page_Load);
 }
#endregion
}
}

C#实现Windows资源管理器文件预览

上一篇文章大致介绍了一下C++实现Windows文件预览的方法,这里介绍一下通过.NET方式实现文件预览。其实原理还是一样,需要通过实现系统定义的COM接口,包括 IInitializeWithF...
  • hey_zng
  • hey_zng
  • 2016年03月18日 17:54
  • 4888

自定义Windows资源管理器预览的实现

在Windows中,资源管理器对文件的预览是通过系统PreviewHandler组件实现的,因此,想要实现自定义的PreviewHandler就需要实现一个定义了预览接口COM组件。 从Micros...
  • hey_zng
  • hey_zng
  • 2016年03月18日 17:47
  • 1666

用Visual C++打造自己的资源管理器

Windows的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机当前所有驱动器以及驱动器中的所有文件夹,当用户单击文件夹后,如果该文件夹下面还有子文件夹,则上层文件夹展开显示下级的文...
  • hczhiyue
  • hczhiyue
  • 2014年01月16日 22:18
  • 1737

mfc的CTreeCtrl控件实现windows的资源管理器

记录这个文章没别的意思就是当做是学习笔记,没什么技术含量,因为测试其他功能需要在界面上面方便把东西拷贝到电脑上面,使用需要在测试工程里面直接把windows的资源管理器展示出来,这个东西以前做过,但是...
  • nanjun520
  • nanjun520
  • 2015年07月31日 15:16
  • 1702

windows资源管理器的实现实例

Windows的资源管理器想必大家都用过,该程序的窗口一分为二,左边的窗口显示本机当前所有驱动器以及驱动器中的所有文件夹,当用户单击文件夹后,如果该文件夹下面还有子文件夹,则上层文件夹展开显示下级的文...
  • u010983763
  • u010983763
  • 2016年10月25日 11:13
  • 1674

【技巧学习】解决"无法在windows资源管理器中查看此FTP站点"的问题

此文目的: 1.搜索技巧 2.记录本人解决"无法在windows资源管理器中查看此FTP站点"的问题  的思路以及技巧工具。 引用原文(重要信息我用红色表明了) ---------------...
  • tianwuya217
  • tianwuya217
  • 2013年03月14日 20:24
  • 20884

用java实现的资源管理器

功能分析 资源管理器树形结构的显示。 菜单的显示和操作。 文件夹的操作,新建、删除、拷贝、移动等。 文件的操作,新建、删除、拷贝、移动等。 参考Linux和windows下的资源管理器。 实现思路 用...
  • jiaxingzheng
  • jiaxingzheng
  • 2015年03月14日 22:32
  • 2689

Windows10资源管理器占用CPU过高解决办法

升级 win10后,发现每次开机后发现CPU一下子就用了80% - 90%多,CPU占用过高一方面产热高,另一方面会导致系统速度变慢,这才是最让人难以忍受的地方。笔者试过很过方法,最后才解决这个问题,...
  • qq_32528231
  • qq_32528231
  • 2017年05月13日 10:33
  • 3134

ASP.NET 模拟Windows资源管理器

Windows中文件资源管理主要是通过“Windows资源管理器”来完成,如果想在网络上实现文件的远程浏览,可以通过如下几种方法:   1、FTP   2、Remote Desktop Manager...
  • crs1934
  • crs1934
  • 2014年03月11日 15:33
  • 807

如何解决win7资源管理器不断重启和停止工作

最近在使用电脑的时候出现了这个问题,差了网上很多资料,都说是因为系统资源不够所以导致这个问题,其实这么说比较扯蛋,因为根本没有解决问题。 当然,出现这种情况可能存在的问题有很多种,但是类似系统资源...
  • kenhubery
  • kenhubery
  • 2015年01月20日 11:57
  • 6431
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现类似Windows资源管理器的DataGrid
举报原因:
原因补充:

(最多只允许输入30个字)