生活就好像一盒巧克力

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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
                        }
                        }
                        
posted on 2007-03-20 13:45  yiriqing  阅读(366)  评论(0)    收藏  举报