扩展GridView控件(5) - 固定指定行、指定列

GridView固定表头和列 实例(GridView冻结表头和列) 这个与asp.net中GridView相关的一个实例,实现GridView冻结表头和列,挺好用的。 立即下载
GridView既强大又好用。为了让它更强大、更好用,我们来写一个继承自GridView的控件。
[索引页]
[源码下载]


扩展GridView控件(5) - 固定指定行、指定列


作者: webabcd


/* 正式版的实现 开始 */

介绍
扩展GridView控件:
固定指定行、指定列,根据RowType固定行,根据RowState固定行

使用方法(设置FixRowColumn复合属性):
FixRowType - 需要固定的行的RowType(用逗号“,”分隔)
FixRowState - 需要固定的行的RowState(用逗号“,”分隔)
FixRows - 需要固定的行的索引(用逗号“,”分隔)
FixColumns - 需要固定的列的索引(用逗号“,”分隔)
TableWidth - 表格的宽度
TableHeight - 表格的高度


关键代码
css
/*固定行*/
.yy_sgv_fixRow
{
    position
: relative; top: expression(this.offsetParent.scrollTop - 1);
}

/*固定列*/
.yy_sgv_fixCol
{
    position
: relative; left: expression(this.offsetParent.scrollLeft - 1);
}

/*高优先级的固定*/
.yy_sgv_fixHigh
{
    z-index
: 9999;
}

/*低优先级的固定*/
.yy_sgv_fixLow
{
    z-index
: 1000;
}

c#
using  System;
using  System.Collections.Generic;
using  System.Text;

using  System.Web.UI.WebControls;
using  System.Web.UI;

namespace  YYControls.SmartGridViewFunction
{
    
/// <summary>
    
/// 扩展功能:固定指定行、指定列
    
/// </summary>

    public class FixRowColumnFunction : ExtendFunction
    
{
        
/// <summary>
        
/// 构造函数
        
/// </summary>

        public FixRowColumnFunction()
            : 
base()
        
{

        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="sgv">SmartGridView对象</param>

        public FixRowColumnFunction(SmartGridView sgv)
            : 
base(sgv)
        
{

        }


        
/// <summary>
        
/// 扩展功能的实现
        
/// </summary>

        protected override void Execute()
        
{
            
this._sgv.RowDataBoundCell += new SmartGridView.RowDataBoundCellHandler(_sgv_RowDataBoundCell);
            
this._sgv.RenderBegin += new SmartGridView.RenderBeginHandler(_sgv_RenderBegin);
            
this._sgv.RenderEnd += new SmartGridView.RenderEndHandler(_sgv_RenderEnd);
        }


        
/// <summary>
        
/// SmartGridView的RowDataBoundCell事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="gvtc"></param>

        void _sgv_RowDataBoundCell(object sender, GridViewTableCell gvtc)
        
{
            TableCell tc 
= gvtc.TableCell;
            GridViewRow gvr 
= (GridViewRow)tc.Parent;

            
int i = 0; // 0-既不固定行也不固定列;1-固定行或固定列;2-既固定行也固定列
            
// 固定行
            if 
            (
                (
                    
!String.IsNullOrEmpty(this._sgv.FixRowColumn.FixRows) 
                    
&& 
                    Array.Exists(
this._sgv.FixRowColumn.FixRows.Split(','), delegate(string s) { return s == gvr.RowIndex.ToString(); })
                )
                
|| 
                (
                    
!String.IsNullOrEmpty(this._sgv.FixRowColumn.FixRowType) 
                    
&& 
                    Array.Exists(
this._sgv.FixRowColumn.FixRowType.Split(','), delegate(string s) { return s == gvr.RowType.ToString(); })
                )
                
|| 
                (
                    
!String.IsNullOrEmpty(this._sgv.FixRowColumn.FixRowState) 
                    
&& 
                    Array.Exists(
this._sgv.FixRowColumn.FixRowState.Split(','), delegate(string s) { return s == gvr.RowState.ToString(); })
                )
            )
            
{
                i
++;
                Helper.Common.SetAttribute(tc, 
"class", "yy_sgv_fixRow", AttributeValuePosition.Last, ' ');
            }

            
// 固定列
            if 
                (
                    
!String.IsNullOrEmpty(this._sgv.FixRowColumn.FixColumns)
                    
&&
                    Array.Exists(
this._sgv.FixRowColumn.FixColumns.Split(','), delegate(string s) { return s == gvtc.ColumnIndex.ToString(); })
                )
            
{
                i
++;
                Helper.Common.SetAttribute(tc, 
"class", "yy_sgv_fixCol", AttributeValuePosition.Last, ' ');
            }


            
// 低等级的z-index
            if (i == 1)
            
{
                Helper.Common.SetAttribute(tc, 
"class", "yy_sgv_fixLow", AttributeValuePosition.Last, ' ');
            }

            
// 高等级的z-index
            else if (i == 2)
            
{
                Helper.Common.SetAttribute(tc, 
"class", "yy_sgv_fixHigh", AttributeValuePosition.Last, ' ');
            }

        }


        
/// <summary>
        
/// RenderBegin
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="writer"></param>

        void _sgv_RenderBegin(object sender, HtmlTextWriter writer)
        
{
            writer.AddStyleAttribute(HtmlTextWriterStyle.Overflow, 
"auto");
            writer.AddStyleAttribute(HtmlTextWriterStyle.Position, 
"relative");
            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, String.IsNullOrEmpty(
this._sgv.FixRowColumn.TableWidth) ? "100%" : this._sgv.FixRowColumn.TableWidth);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, String.IsNullOrEmpty(
this._sgv.FixRowColumn.TableHeight) ? "100%" : this._sgv.FixRowColumn.TableHeight);
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
        }


        
/// <summary>
        
/// RenderEnd
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="writer"></param>

        void _sgv_RenderEnd(object sender, HtmlTextWriter writer)
        
{
            writer.RenderEndTag();
        }

    }

}

/* 正式版的实现 结束 */


/* 测试版的实现 开始 */

介绍
平时使用GridView的时候会有固定表头、指定行或指定列的需求,就像Excel冻结行、列那样。其实我们可以用CSS来搞定。扩展一下GridView,通过设置几个属性来达到这样的功能。


控件开发
1、新建一个继承自GridView的类,另外为了保持滚动条状态,还要继承IPostBackDataHandler接口
     /// <summary>
    
/// 继承自GridView
    
/// </summary>

    [ToolboxData( @" <{0}:SmartGridView runat='server'></{0}:SmartGridView> " )]
    
public   class  SmartGridView : GridView, IPostBackDataHandler
    
{

    }


2、新建一个FixRowCol类,有七个属性
using  System;
using  System.Collections.Generic;
using  System.Text;

using  System.ComponentModel;

namespace  YYControls.SmartGridView
{
    
/// <summary>
    
/// 固定表头、指定行或指定列的实体类
    
/// </summary>

    [TypeConverter(typeof(ExpandableObjectConverter))]
    
public class FixRowCol
    
{
        
private bool _isFixHeader;
        
/// <summary>
        
/// 固定表头否?
        
/// </summary>

        [Description("固定表头否?"), Category("扩展"), DefaultValue(false), NotifyParentProperty(true)]
        
public virtual bool IsFixHeader
        
{
            
get { return _isFixHeader; }
            
set { _isFixHeader = value; }
        }


        
private bool _isFixPager;
        
/// <summary>
        
/// 固定分页行否?
        
/// </summary>

        [Description("固定分页行否?"), Category("扩展"), DefaultValue(false), NotifyParentProperty(true)]
        
public virtual bool IsFixPager
        
{
            
get { return _isFixPager; }
            
set { _isFixPager = value; }
        }


        
private string _fixRowIndices;
        
/// <summary>
        
/// 需要固定的行的索引(用逗号“,”分隔)
        
/// </summary>

        [Description("需要固定的行的索引(用逗号“,”分隔)"), Category("扩展"), NotifyParentProperty(true)]
        
public virtual string FixRowIndices
        
{
            
get { return _fixRowIndices; }
            
set { _fixRowIndices = value; }
        }


        
private string _fixColumnIndices;
        
/// <summary>
        
/// 需要固定的列的索引(用逗号“,”分隔)
        
/// </summary>

        [Description("需要固定的列的索引(用逗号“,”分隔)"), Category("扩展"), NotifyParentProperty(true)]
        
public virtual string FixColumnIndices
        
{
            
get { return _fixColumnIndices; }
            
set { _fixColumnIndices = value; }
        }


        
private System.Web.UI.WebControls.Unit _tableWidth;
        
/// <summary>
        
/// 表格的宽度
        
/// </summary>

        [Description("表格的宽度"), Category("扩展"), NotifyParentProperty(true)]
        
public System.Web.UI.WebControls.Unit TableWidth
        
{
            
get { return _tableWidth; }
            
set { _tableWidth = value; }
        }


        
private System.Web.UI.WebControls.Unit _tableHeight;
        
/// <summary>
        
/// 表格的高度
        
/// </summary>

        [Description("表格的高度"), Category("扩展"), NotifyParentProperty(true)]
        
public System.Web.UI.WebControls.Unit TableHeight
        
{
            
get { return _tableHeight; }
            
set { _tableHeight = value; }
        }


        
private bool _enableScrollState;
        
/// <summary>
        
/// 是否保持滚动条的状态
        
/// </summary>

        [Description("是否保持滚动条的状态"), Category("扩展"), DefaultValue(false), NotifyParentProperty(true)]
        
public bool EnableScrollState
        
{
            
get { return _enableScrollState; }
            
set { _enableScrollState = value; }
        }


        
/// <summary>
        
/// ToString();
        
/// </summary>
        
/// <returns></returns>

        public override string ToString()
        
{
            
return "FixRowCol";
        }

    }

}


3、在继承自GridView的类中加一个复杂对象属性,该复杂对象就是第2步创建的那个FixRowCol
         private  FixRowCol _fixRowCol;
        
/// <summary>
        
/// 固定表头、指定行或指定列
        
/// </summary>

        [
        Description(
" 固定表头、指定行或指定列 " ),
        Category(
" 扩展 " ),
        DefaultValue(
"" ),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
        PersistenceMode(PersistenceMode.InnerProperty)
        ]
        
public   virtual  FixRowCol FixRowCol
        
{
            
get
            
{
                
if (_fixRowCol == null)
                
{
                    _fixRowCol 
= new FixRowCol();
                }

                
return _fixRowCol;
            }

        }

4、重写OnRowDataBound以设置每个单元格的样式,从而实现固定表头、指定行或指定列的功能。
         /// <summary>
        
/// OnRowDataBound
        
/// </summary>
        
/// <param name="e"></param>

         protected   override   void  OnRowDataBound(GridViewRowEventArgs e)
        
{
            
if (e.Row.RowType == DataControlRowType.Pager)
            
{
                
if (FixRowCol.IsFixPager)
                
{
                    
if (this.PagerSettings.Position == PagerPosition.Top || (this.PagerSettings.Position == PagerPosition.TopAndBottom && _isTopPager))
                    
{
                        
// TopPager固定行和列
                        e.Row.Cells[0].Attributes.Add("style", "z-index:999; position: relative; top: expression(this.offsetParent.scrollTop); left: expression(this.offsetParent.scrollLeft);");
                        
// 现在是TopPager,之后就是BottomPager了,所以设置_isTopPager为false
                        _isTopPager = false;
                    }

                    
else if (this.PagerSettings.Position == PagerPosition.TopAndBottom && !_isTopPager)
                    
{
                        
// BottomPager只固定列
                        e.Row.Cells[0].Attributes.Add("style", "z-index:999; position: relative; left: expression(this.offsetParent.scrollLeft);");
                        
// 现在是BottomPager,之后就是TopPager了,所以设置_isTopPager为true
                        _isTopPager = true;
                    }

                }

            }


            
if (e.Row.RowType == DataControlRowType.DataRow || e.Row.RowType == DataControlRowType.Header)
            
{
                
// 给每一个指定固定的列的单元格加上css属性
                if (!String.IsNullOrEmpty(FixRowCol.FixColumnIndices))
                
{
                    
// 列索引
                    foreach (string s in FixRowCol.FixColumnIndices.Split(','))
                    
{
                        
int i;
                        
if (!Int32.TryParse(s, out i))
                            
throw new ArgumentException("FixColumnIndices", "含有非整形的字符");
                        
if (i > e.Row.Cells.Count)
                            
throw new ArgumentOutOfRangeException("FixColumnIndices", "溢出");

                        e.Row.Cells[i].Attributes.Add(
"style", "position: relative; left: expression(this.offsetParent.scrollLeft);");
                    }

                }


                
bool isFixRow = false; // 当前行是否固定
                if (FixRowCol.IsFixHeader && e.Row.RowType == DataControlRowType.Header)
                
{
                    isFixRow 
= true;
                }


                
if (!String.IsNullOrEmpty(FixRowCol.FixRowIndices) && e.Row.RowType == DataControlRowType.DataRow)
                
{
                    
// 行索引
                    foreach (string s in FixRowCol.FixRowIndices.Split(','))
                    
{
                        
int i;
                        
if (!Int32.TryParse(s, out i))
                            
throw new ArgumentException("FixRowIndices", "含有非整形的字符");
                        
if (i > e.Row.Cells.Count)
                            
throw new ArgumentOutOfRangeException("FixRowIndices", "溢出");

                        
if (i == e.Row.RowIndex)
                        
{
                            isFixRow 
= true;
                            
break;
                        }

                    }

                }


                
// 固定该行
                if (isFixRow)
                
{
                    
// 该行的每一个单元格
                    for (int j = 0; j < e.Row.Cells.Count; j++)
                    
{
                        
// 该单元格不属于固定列
                        if (String.IsNullOrEmpty(e.Row.Cells[j].Attributes["style"]) || e.Row.Cells[j].Attributes["style"].IndexOf("position: relative;") == -1)
                        
{
                            e.Row.Cells[j].Attributes.Add(
"style", " position: relative; top: expression(this.offsetParent.scrollTop);");
                        }

                        
// 该单元格属于固定列
                        else
                        
{
                            e.Row.Cells[j].Attributes.Add(
"style", e.Row.Cells[j].Attributes["style"] + "top: expression(this.offsetParent.scrollTop); z-index: 666;");
                        }

                    }

                }

            }


            
base.OnRowDataBound(e);
        }


5、增加两个私有变量
         /// <summary>
        
/// 如果固定行、列的话 滚动条的x位置
        
/// </summary>

         private   int  _yy_SmartGridView_x;
        
/// <summary>
        
/// 如果固定行、列的话 滚动条的y位置
        
/// </summary>

         private   int  _yy_SmartGridView_y;

6、重写GridView的OnPreRender方法,用于注册两个HiddenField,以及注册设置GridView的滚动条的位置的javascript代码
         /// <summary>
        
/// OnPreRender
        
/// </summary>
        
/// <param name="e"></param>

         protected   override   void  OnPreRender(EventArgs e)
        
{
            
if (FixRowCol.EnableScrollState)
            
{
                
// 滚动条x位置
                Page.ClientScript.RegisterHiddenField("yy_SmartGridView_x", _yy_SmartGridView_x.ToString());
                
// 滚动条y位置
                Page.ClientScript.RegisterHiddenField("yy_SmartGridView_y", _yy_SmartGridView_y.ToString());

                
// 设置GridView的滚动条的位置
                Page.ClientScript.RegisterStartupScript(
                    
this.GetType(),
                    
"jsSetScroll", "<script type=/"text/javascript/">document.getElementById('yy_ScrollDiv').scrollLeft=" + _yy_SmartGridView_x + ";document.getElementById('yy_ScrollDiv').scrollTop=" + _yy_SmartGridView_y + ";</script>"
                    );

                
// 将控件注册为要求在页回发至服务器时进行回发处理的控件
                if (Page != null) Page.RegisterRequiresPostBack(this);
            }


            
base.OnPreRender(e);
        }


7、重写GridView的Render方法,将GridView用一个div包裹起来。
         /// <summary>
        
/// Render
        
/// </summary>
        
/// <param name="writer"></param>

         protected   override   void  Render(HtmlTextWriter writer)
        
{
            
// 给GridView一个容器 <div>
            if (!FixRowCol.TableWidth.IsEmpty || !FixRowCol.TableHeight.IsEmpty)
            
{
                
if (FixRowCol.TableWidth.IsEmpty) FixRowCol.TableWidth = new Unit(100, UnitType.Percentage);
                
if (FixRowCol.TableHeight.IsEmpty) FixRowCol.TableHeight = new Unit(100, UnitType.Percentage);

                writer.Write(
"<div id='yy_ScrollDiv' style=/"overflow: auto; width: "
                    + FixRowCol.TableWidth.ToString() + "; height: "
                    
+ FixRowCol.TableHeight.ToString() + "; position: relative;/" ");

                
// 如果保持滚动条的状态的话,用隐藏字段记录滚动条的位置
                if (FixRowCol.EnableScrollState)
                
{
                    writer.Write(
"onscroll=/"document.getElementById('yy_SmartGridView_x').value = this.scrollLeft; document.getElementById('yy_SmartGridView_y').value = this.scrollTop;/">");
                }

                
else
                
{
                    writer.Write(
">");
                }

            }


            
base.Render(writer);

            
// </div> 结束
            if (!FixRowCol.TableWidth.IsEmpty || !FixRowCol.TableHeight.IsEmpty)
            
{
                writer.Write(
"</div>");
            }

        }


8、获取存储了滚条位置信息的HiddenField的值
         void  IPostBackDataHandler.RaisePostDataChangedEvent()
        
{

        }


        
bool  IPostBackDataHandler.LoadPostData( string  postDataKey, NameValueCollection postCollection)
        
{
            
// 获取两个保存了 固定行、列后 的GridView滚动条的位置信息
            _yy_SmartGridView_x = String.IsNullOrEmpty(postCollection["yy_SmartGridView_x"]) ? 0 : Convert.ToInt32(postCollection["yy_SmartGridView_x"]);
            _yy_SmartGridView_y 
= String.IsNullOrEmpty(postCollection["yy_SmartGridView_y"]) ? 0 : Convert.ToInt32(postCollection["yy_SmartGridView_y"]);

            
return false;
        }



控件使用
添加这个控件到工具箱里,然后拖拽到webform上,设置其FixRowCol下的7个属性即可。IsFixHeader是固定表头否?;IsFixPager是固定分页行否?;FixRowIndices是需要固定的行的索引(用逗号“,”分隔);FixColumnIndices是需要固定的列的索引(用逗号“,”分隔);TableWidth是表格的宽度;TableHeight是表格的高度;EnableScrollState为是否保持滚动条的状态
ObjData.cs
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;

using  System.ComponentModel;

/// <summary>
/// OjbData 的摘要说明
/// </summary>

public   class  OjbData
{
    
public OjbData()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }


    [DataObjectMethod(DataObjectMethodType.Select, 
true)]
    
public DataTable Select()
    
{
        DataTable dt 
= new DataTable();
        dt.Columns.Add(
"no", typeof(string));
        dt.Columns.Add(
"name", typeof(string));

        
for (int i = 0; i < 30; i++)
        
{
            DataRow dr 
= dt.NewRow();
            dr[
0] = "no" + i.ToString().PadLeft(2, '0');
            dr[
1] = "name" + i.ToString().PadLeft(2, '0');

            dt.Rows.Add(dr);
        }


        
return dt;
    }

}


Default.aspx
<% @ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"  %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title > SmartGridView测试 </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
        
< yyc:SmartGridView  ID ="SmartGridView1"  runat ="server"  AutoGenerateColumns ="False"
            DataSourceID
="ObjectDataSource1"  Width ="1000px" >
            
< Columns >
                
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
                
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
                
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
                
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
                
< asp:BoundField  DataField ="no"  HeaderText ="序号"  SortExpression ="no"   />
                
< asp:BoundField  DataField ="name"  HeaderText ="名称"  SortExpression ="name"   />
            
</ Columns >
            
< FixRowCol  FixColumnIndices ="0,1"  FixRowIndices ="0"  IsFixHeader ="True"  TableHeight ="300px"
                TableWidth
="300px"  EnableScrollState ="true"   />
        
</ yyc:SmartGridView >
        
< asp:ObjectDataSource  ID ="ObjectDataSource1"  runat ="server"  SelectMethod ="Select"
            TypeName
="OjbData" ></ asp:ObjectDataSource >
    
</ form >
</ body >
</ html >

/* 测试版的实现 结束 */


OK
[源码下载]
asp.net 锁定gridview首行、前几列 附详细使用说明,非常简单,解决问题直接了当。 立即下载

相关推荐

ASP.NET—005:GridView增加一行JS实现

文章:http://blog.youkuaiyun.com/yysyangyangyangshan/article/details/20571705

DevExpress控件GridControl列固定(冻结)

之前知道DataGridView可以设置列的Forzon属性让列位置固定,不随着滚动条的拖动而移动,昨天同事大哥想设置GirdView的列固定,但是我没找到Forzon方法,后来同事大哥发现了是Fixed属性。get知识点。 值得注意的是,DataGridView中,只能将列固定在左侧,若设置了某列Forzon属性为True,这列左侧的所有列都将被冻结,原有显示顺序不变。而GridView......

李趣趣的学习笔记 1万+

【科研导航】【计算机视觉与图像处理】从顶刊到潜力股:跨学科(电子/电气/信息)SCI期刊投稿全景图

本文全面解析了计算机视觉与图像处理领域的SCI期刊投稿策略,涵盖从顶刊到潜力股的各类期刊特点。重点介绍了IEEE Transactions系列、Elsevier旗舰期刊以及二区优质期刊的审稿偏好和投稿技巧,特别适合电子/电气/信息交叉学科的研究者。文章还提供了三区、四区期刊的实用投稿建议,帮助科研新手快速找到适合的发表平台。

weixin_30897233的博客 81

WPF固定列,DataGrid固定列,固定右侧列、固定左侧列

固定右侧列:DataGridHelper.RightFrozenColumnCount=“1” (自定义的附加属性)固定列的背景色:DataGridHelper.FrozenColumnBackground。固定左侧列:FrozenColumnCount =“1”1、nuget搜索XiaFControl下载。QQ技术交流群:371769310。2、在App.xaml引入资源。

qq_42707143的博客 2640

Calibre PEX提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文深入解析Calibre PEX工具中hcell与xcell文件的协同工作机制,提供模块级寄生参数提取方案。通过实战案例和避坑指南,帮助工程师精准屏蔽已验证IP模块,提升仿真效率和数据一致性,适用于65nm以下工艺节点的复杂SoC设计。

weixin_29275257的博客 625

深入解析经典蓝牙连接:从HCI命令到LMP协议的完整流程

本文深入解析经典蓝牙连接的完整流程,从设备发现、寻呼建立物理链路,到安全配对与加密的每一步。通过对照HCI LOG与AIR LOG,详细拆解了HCI命令与LMP协议报文的对应关系,帮助开发者精准定位连接问题,掌握蓝牙调试的核心方法。

weixin_29260291的博客 449

上接扩展GridView控件(5) - 固定指定行、指定列

4、重写OnRowDataBound以设置每个单元格的样式,从而实现固定表头、指定行或指定列的功能。 /// <summary>///OnRowDataBound/// </summary>/// <param n...

weixin_33759269的博客 239

保姆级教程:用dnSpy调试Unity游戏,从找DLL到打断点全流程(附调试版mono.dll下载)

本文详细介绍了使用dnSpy调试Unity游戏的全流程,包括环境准备、关键程序集定位、mono.dll版本匹配与替换、调试环境配置及实战技巧。通过本教程,开发者可以高效进行Unity游戏逆向分析,适用于学习设计模式或安全审计等场景。

weixin_30236595的博客 577

扩展GridView控件(五)——固定表头、指定行或指定列

扩展GridView控件(五)——固定表头、指定行或指定列介绍平时使用GridView的时候会有固定表头、指定行或指定列的需求,就像Excel冻结行、列那样。其实我们可以用CSS来搞定。扩展一下GridView,通过设置几个属性来达到这样的功能。控件开发1、新建一个继承自GridView的类,另外为了保持滚动条状态,还要继承IPostBackDataHandler接口    /**////

坚定的锡兵 1535

Pre-suite 开发之MFi功能搭建

Pre-suite 固件中只有带无线硬件的Ezairo 7160sl才具备无线通信能力,其无线功能包括标准BLE 5.2 低功耗蓝牙功能以及非标准的低功耗无线音频流功能。Ezairo 7160sl 支持3种低功耗无线音频流协议:来自APPLE的MFi,来自Google的ASHA以及来自onsemi的remote mic。其中MFi音频流走的G.722编码的Mode1,速率为64kbps;而非MFi音频流走的G.722的Mode3,速率为48kbps.

SnowYang2017的博客 1497

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

扩展GridView控件(索引) - 增加多个常用功能

文章索引扩展GridView控件(1) - 鼠标经过行时改变行的样式扩展GridView控件(2) - 复合排序和排序状态提示扩展GridView控件(3) - 根据按钮的CommandName设置其客户端属性扩展GridView控件(4) - 联动复选框(复选框的全选和取消全选)扩展GridView控件(5) - 固定指定行、指定列扩展GridView控件(6) - 响应行的单击事件和双击事件扩

lp2007的专栏 3466

17、Nimble 包开发与并行编程指南

本文介绍了Nimble包的开发与版本管理流程,涵盖语义化版本控制规范及发布步骤;深入探讨了Nim中的并行编程基础,包括并发与并行的区别、threads模块与threadpool模块的使用方法及其差异;分析了线程执行的不确定性、线程池的优势,并提供了线程同步和资源管理的实践示例,帮助开发者高效构建稳定、高性能的Nim应用程序。

wine的专栏 55

转gridview的扩展,实现固定列和列头固定。

介绍 扩展GridView控件: 固定指定行、指定列,根据RowType固定行,根据RowState固定行 使用方法(设置FixRowColumn复合属性): FixRowType - 需要固定的行的RowType(用逗号“,”分隔) FixRowState - 需要固定的行的RowState(用逗号“,”分隔) FixRows - 需要固定的行的索引(用逗号“,”分隔) Fi...

weixin_30820077的博客 152

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1314

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

扩展GridView控件(全)——增加10个常用功能

扩展GridView控件(全)——增加10个常用功能 控件开发 扩展GridView控件(一)——鼠标经过行时改变行的样式 控件使用 1、鼠标经过行时改变行的样式 CssClassMouseOver - 鼠标经过行时行的样式的CSS类名 2、给字段标题加上排序状态 设置其SortTip下的4个属性即可 SortAscImage - 升序提示图片 SortAscText

drr789的专栏 1741

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Asp.net 2.0 自定义控件开发[实现GridView多行表头固定表体滚动效果][示例代码下载]

(一). 概述        1. 实现GridView表头固定表体滚动效果        2. 继承GridView的所有功能, 增加扩展功能, 表体滚动功能; 不需要另外加辅助滚动控件, 如.        3. 支持多行表头滚动, 此控件能够自动检测到使用者增加的表头的行数. 准确的实现表头滚动.            有增加GridView多表头实现方案, 请看[多表头自定

飘逸软件技术信息服务网 6327

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: [翻译]开发一个自己的HTML在线编辑器(一)
下一篇: [翻译]Hello ASP.NET AJAX
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值