using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Design;
using System.Resources;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DataGridPro
{
/// <summary>
/// 名称: Asp.Net DataGrid WebControl Plus Edition。
/// 功能: 在原有DataGrid基础上增加以下功能
///(单击行事件,双击行事件,水平/竖直滚动条。)
/// 作者: CSDN:jjstar(北人)。
/// 时间: 2003年5月母亲节前。
/// </summary>
public class jjstarDataGrid: DataGrid,IPostBackEventHandler
{
/// <summary>
///DataGrid所在容器宽度。
///将此属性设置为小于DataGrid的Width,,
///而且控件处于滚动条模式
///(属性DisplayMode=“ScrollMode”)的时候,
///才可以出现滚动条。
/// </summary>
[Category("布局"),Description("DataGrid所在容器宽度。")]
public virtual Unit FrameWidth
{
get
{
object obj=ViewState["FrameWidth"];
return ((null ==obj ) ? Width : (Unit)obj);
}
set
{
ViewState["FrameWidth"] = value;
}
}
[Category("外观"),Description("鼠标所在行的颜色。")]
[Editor(typeof(ColorEditor),typeof(UITypeEditor))]
public Color CurrentRowColor
{
get
{
object obj=ViewState["CurrentRowColor"];
return ((null ==obj ) ? BackColor : (Color)obj);
}
set
{
ViewState["CurrentRowColor"]=value;
}
}
///<summary>
///DataGrid的显示模式,
///OriginalMode:普通模式,
///ScrollMode:滚动条模式,
///此属性只能通过下拉列表选择。
/// </summary>
[Category("样式"),Description("DataGrid的显示模式。")]
[TypeConverter(typeof(modeConverter))]
public string DisplayMode
{
get
{
object obj=ViewState["mode"];
return ((null ==obj ) ? "ScrollMode" : (string)obj);
}
set
{
ViewState["mode"]=value;
}
}
/// <summary>
///向下滚动事件(相当于DataGrid的向后翻页)。
///当控件处于滚动条模式
///(属性DisplayMode=“ScrollMode”)的时候,
///需要处理此事件。
/// </summary>
public event EventHandler Scroll2Foot;
/// <summary>
///向上滚动事件(相当于DataGrid的向前翻页),
///当控件处于滚动条模式
///(属性DisplayMode=“ScrollMode”)的时候,
///需要处理此事件。
/// </summary>
public event EventHandler Scroll2Top;
/// <summary>
/// 鼠标单击DataGrid行事件。
/// </summary>
public event DataGridItemEventHandler Click;
/// <summary>
/// 鼠标双击DataGrid行事件。
/// </summary>
public event DataGridItemEventHandler DblClick;
protected void OnClick(int index)
{
if(null!=Click)
Click(this,new DataGridItemEventArgs(Items[index]));
}
protected void OnDblClick(int index)
{
if(null!=DblClick)
DblClick(this,new DataGridItemEventArgs(Items[index]));
}
protected void OnScroll2Foot()
{
if(null!=Scroll2Foot)
Scroll2Foot(this,new EventArgs());
}
protected void OnScroll2Top()
{
if(null!=Scroll2Top)
Scroll2Top(this,new EventArgs());
}
// private bool LoadPostData
// (string postDataKey,NameValueCollection postData)
// {
// string PostedValue=postData[postDataKey];
// if(null==PostedValue)
// {
// return true;
// }
// return false;
// }
/// <summary>
/// 通过eventArgument触发相应事件。
/// </summary>
/// <param name="eventArgument">
/// SCROLL2TOP:向上滚动事件,
/// SCROLL2FOOT:向下滚动事件,
/// CLK前缀:单击事件(此时后缀为触发的行号,从0开始),
/// DBL前缀:双击事件(此时后缀为触发的行号,从0开始)。
/// </param>
public void RaisePostBackEvent(string eventArgument)
{
if("SCROLLMODE"==DisplayMode.ToUpper())
{
if("SCROLL2TOP"==eventArgument.ToUpper())
{
OnScroll2Top();
return;
}
if("SCROLL2FOOT"==eventArgument.ToUpper())
{
OnScroll2Foot();
return;
}
}
if(eventArgument.StartsWith("CLK"))
{
eventArgument=
eventArgument.TrimStart(new Char[]{'C','L','K'});
OnClick(Convert.ToInt32(eventArgument));
return;
}
if(eventArgument.StartsWith("DBL"))
{
eventArgument=
eventArgument.TrimStart(new Char[]{'D','B','L'});
OnDblClick(Convert.ToInt32(eventArgument));
return;
}
}
protected override void OnItemDataBound(DataGridItemEventArgs e)
{
base.OnItemDataBound(e);
if((ListItemType.Pager==e.Item.ItemType)||
(ListItemType.Footer==e.Item.ItemType))
{
return;
}
if(ListItemType.Header!=e.Item.ItemType)
{
e.Item.Attributes["id"]=
e.Item.ItemType.ToString()+e.Item.ItemIndex.ToString();
e.Item.Attributes["OnMouseOut"]=
"javascript:bgColor='"+BackColor.Name.ToString()+"';";
e.Item.Attributes["OnMouseOver"]=
"javascript:bgColor='"+CurrentRowColor.Name.ToString()+"';";
//添加客户端双击行事件
e.Item.Attributes["OnDblClick"]=
"javascript:"+UniqueID+"_dbl("+e.Item.ItemIndex.ToString()+");";
//添加客户端单击行事件
e.Item.Attributes["OnClick"]=
"javascript:"+UniqueID+"_clk("+e.Item.ItemIndex.ToString()+");";
}
else
{
int cellCount=e.Item.Cells.Count;
for(int index=0;index<cellCount;index++)
{
e.Item.Cells[index].Attributes["id"]=
"HEADER"+index.ToString();
}
}
}
|
|
回复人: jjstar(北人) ( ) 信誉:96 |
2003-05-09 18:55:05Z |
得分:0 |
|
|
? |
/// <summary>
/// 单击双击脚本。
/// </summary>
/// <param name="canClick">
/// 是否允许提交DataGrid单击行事件。
/// </param>
/// <param name="canDblClick">
/// 是否允许提交DataGrid双击行事件。
/// </param>
/// <returns>
/// 处理设置DataGrid单击双击行事件的javascript脚本。
/// </returns>
private string clickScript(bool canClick,bool canDblClick)
{
StringBuilder sbScript=new StringBuilder();
sbScript.Append("<script language='javascript'>")//;
//单击标志
.Append(
"var "+UniqueID+"_click=0;")
//双击标志
.Append(
"var "+UniqueID+"_dblclick=0;")
//被单击或双击的行标志
.Append(
"var "+UniqueID+"_row;")
//单击事件
.Append(
"function "+UniqueID+"_clk(row)")
.Append("{")
.Append(
"if((\"TD\"==event.srcElement.tagName)||(\"TR\"==event.srcElement.tagName))")
.Append("{")
.Append(UniqueID+"_click++;")
.Append(UniqueID+"_row=row;")
.Append(
"setTimeout('"+UniqueID+"_submit()',300)")
.Append("}")
.Append("}")
//双击事件
.Append(
"function "+UniqueID+"_dbl(row)")
.Append("{")
.Append(
"if((\"TD\"==event.srcElement.tagName)||(\"TR\"==event.srcElement.tagName))")
.Append("{")
.Append(UniqueID+"_dblclick++;")
.Append(UniqueID+"_row=row;")
.Append("}")
.Append("}")
//提交单双击事件
.Append(
"function "+UniqueID+"_submit()")
.Append("{")
.Append(
"if((1=="+UniqueID+"_click)&&(1=="+UniqueID+"_dblclick))")
.Append("{");
if(true==canDblClick)
{
sbScript.Append(
"__doPostBack('"+UniqueID+"','DBL'+"+UniqueID+"_row);");
}
sbScript.Append("}")
.Append("else {");
if(true==canClick)
{
sbScript.Append(
"__doPostBack('"+UniqueID+"','CLK'+"+UniqueID+"_row);");
}
sbScript.Append("}")
//单击标志复位
.Append(
UniqueID+"_click=0;")
//双击标志复位
.Append(
UniqueID+"_dblclick=0;")
.Append("}")
.Append("</script>");
return sbScript.ToString();
}
/// <summary>
/// 滚动表脚本。
/// </summary>
/// <param name="canScroll">
/// 是否允许DataGrid显示滚动条。
/// </param>
/// <returns>
/// 描述滚动表的javascript脚本。
/// </returns>
private string scrollTableScript(bool canScroll)
{
StringBuilder sbScript=new StringBuilder();
sbScript.Append("<script language='javascript'>");
if(true==canScroll)
{
//保存datagrid高度
sbScript.Append(
"var "+UniqueID+"_dgHeight="
+UniqueID+"_sp.scrollHeight;")
//滚动表上沿高度
.Append(
UniqueID+"_rTop.style.height="
+CurrentPageIndex+"*"+UniqueID+"_dgHeight;");
//滚动表下沿高度
if(0==PageCount)
{
sbScript.Append(
UniqueID+"_rFoot.style.height=0;");
}
else
{
sbScript.Append(
UniqueID+"_rFoot.style.height="
+"("+PageCount+"-"+CurrentPageIndex+"-1)*"+UniqueID+"_dgHeight;");
}
//容器高度
sbScript.Append(
UniqueID+"_sp.style.height="
+UniqueID+"_dgHeight+20;");
//滚动条位置
if(PageCount==CurrentPageIndex+1)
{
sbScript.Append(
UniqueID+"_sp.scrollTop="
+"100+"+UniqueID+"_dgHeight*"+CurrentPageIndex+";");
}
else
{
sbScript.Append(
UniqueID+"_sp.scrollTop="
+UniqueID+"_dgHeight*"+CurrentPageIndex+";");
}
//保存滚动条位置
sbScript.Append(
"var "+UniqueID+"_scrollPos="+UniqueID+"_sp.scrollTop;")
//滚动事件标志为未触发
.Append("var "+UniqueID+"_scrolled=0;");
}
else
{
//未分页,不显示垂直滚动条
sbScript.Append(
UniqueID+"_sp.style.height="
+UniqueID+"_sp.scrollHeight+20;");
}
sbScript.Append("</script>");
return sbScript.ToString();
}
/// <summary>
/// 滚动事件脚本。
/// </summary>
/// <param name="canScroll">
/// 是否允许DataGrid显示滚动条。
/// </param>
/// <returns>
/// 滚动事件的javascript脚本。
/// </returns>
private string scrollEventScript(bool canScroll)
{
StringBuilder sbScript=new StringBuilder();
//处理滚动事件
sbScript.Append("<script language='javascript'>")
.Append("function "+UniqueID+"_scroll()")
.Append("{");
if(true==canScroll)
{
sbScript.Append("if(1=="+UniqueID+"_scrolled) return;")
.Append("var "+UniqueID+"_currentPos="
+UniqueID+"_sp.scrollTop;")
//滚动发生了吗?
.Append(
"if("+UniqueID+"_currentPos!="+UniqueID+"_scrollPos)")
.Append("{")
.Append(UniqueID+"_rTop.style.height=0;")
.Append(UniqueID+"_rFoot.style.height=0;")
//滚动事件标志为已触发
.Append(UniqueID+"_scrolled=1;")
.Append(
"if("+UniqueID+"_currentPos>"+UniqueID+"_scrollPos)")
.Append("{")
//提交向下滚动事件
.Append(
Page.GetPostBackEventReference(this,"scroll2foot")+";")
.Append("}")
.Append("else{")
//提交向上滚动事件
.Append(
Page.GetPostBackEventReference(this,"scroll2top")+";")
.Append("}")
.Append("}");
}
sbScript.Append("}")
.Append("</script>");
return sbScript.ToString();
}
protected override void OnPreRender(EventArgs e)
{
Page.GetPostBackEventReference(this);
//注册单击双击事件脚本
Page.RegisterStartupScript(
UniqueID+"clickScript",
clickScript((null==Click)?false:true,(null==DblClick)?false:true));
if("SCROLLMODE"==DisplayMode.ToUpper())
{
//注册滚动表描述脚本
Page.RegisterStartupScript(
UniqueID+"scrollTableScript",
scrollTableScript(AllowPaging));
//注册滚动事件脚本
Page.RegisterStartupScript(
UniqueID+"scrollEventScript",
scrollEventScript(AllowPaging));
}
}
|
Top |
|
|
回复人: jjstar(北人) ( ) 信誉:96 |
2003-05-09 18:55:35Z |
得分:0 |
|
|
? |
protected override void Render(HtmlTextWriter output)
{
//通过属性DisplayMode判断DataGrid的呈现模式
if("SCROLLMODE"==DisplayMode.ToUpper())
{
//画容器(用来容纳datagrid)
output.Write(
"<div id='"+UniqueID+"_sp' "
+"style='OVERFLOW: auto; "
+"WIDTH:"+FrameWidth.Value.ToString()+"; "
//Style没有索引器,
//所以我没能把所有样式复制过来
//哪位大侠能帮我
+"LEFT:"+Style["LEFT"]+"; "
+"TOP:"+Style["TOP"]+"; "
+"POSITION:"+Style["POSITION"]+"; "
+"Z-INDEX:"+Style["Z-INDEX"]+"; "
+"' "
//这个onscroll不用try/catch包起来
//就会报错
//为什么会这样?
//+"onscroll='"+UniqueID+"_scroll()'>");
+"onscroll='try{"+UniqueID+"_scroll()}catch(e){}'>");
//画滚动表
output.Write(
"<table id='"+UniqueID+"_table' "
+"style='WIDTH:"+FrameWidth.Value.ToString()+"; "
+"'>");
//画滚动表上沿
output.Write(
"<tr id='"+UniqueID+"_rTop' "
+"style='HEIGHT:0; WIDTH:"+FrameWidth.Value.ToString()
+"'><td/></tr>");
//datagrid所在位置
output.Write(
"<tr id='"+UniqueID+"_rDG' "
+"style='WIDTH:"+FrameWidth.Value.ToString()
+"'><td>");
//清理datagrid原有属性
Style["LEFT"]="0";
Style["TOP"]="0";
Style["POSITION"]="relative";
PagerStyle.Visible=false;
//输出datagrid
base.Render(output);
output.Write("</td></tr>");
//画滚动表下沿
output.Write(
"<tr id='"+UniqueID+"_rFoot' "
+"style='HEIGHT:0; WIDTH:"+FrameWidth.Value.ToString()
+"'><td/></tr></table>");
//画容器结束
output.Write("</div>");
}
else
{
//只输出datagrid
base.Render(output);
}
}
#region 属性DisplayMode的类型转化器
/// <summary>
/// 属性DisplayMode的类型转化器,
/// 以不可编辑的下拉列表形式提供标准值。
/// </summary>
public class modeConverter:TypeConverter
{
public modeConverter(){}
/// <summary>
/// 存储要提供的所有标准值。
/// </summary>
private static StandardValuesCollection _modeList;
/// <summary>
/// 获取标准值。
/// </summary>
/// <returns>
/// 标准值。
/// </returns>
private StandardValuesCollection getModeList()
{
if(null==_modeList)
{
string[] mode=new string[]{"OriginalMode","ScrollMode"};
_modeList=new StandardValuesCollection(mode);
}
return _modeList;
}
/// <summary></summary>
/// <param name="context"></param>
/// <returns>
/// 返回true,表示提供标准值。
/// </returns>
public override bool
GetStandardValuesSupported(ITypeDescriptorContext context)
{return true;}
/// <summary></summary>
/// <param name="context"></param>
/// <returns>
/// 返回true,
/// 表示标准值只能通过下拉列表选择。
/// </returns>
public override bool
GetStandardValuesExclusive(ITypeDescriptorContext context)
{return true;}
/// <summary>
/// 返回要在下拉列表中提供的标准值。
/// </summary>
/// <param name="context"></param>
/// <returns>
/// 在下拉列表中提供的标准值。
/// </returns>
public override StandardValuesCollection
GetStandardValues(ITypeDescriptorContext context)
{
return getModeList();
}
}
#endregion
}
}
|
|