`
无恨星晨
  • 浏览: 31769 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
文章分类
社区版块
存档分类
最新评论

标题:扩展GridView实现多选、选择行、选中变色等

阅读更多
正文:
本文适合asp.net初学者阅读,高手达人可以无视。
主要功能:
a.隔行色(颜色可自定义)
b.点击行任意位置选择行
c.点击已选中行任意位置取消选择
d.选中行变色(颜色可自定义)
e.多选全选功能
f.添加双击响应事件
GridView控件功能非常强大,但在具体应用中很多时候无法满足特殊需求。例如我前段时间做自己网站(网站制作学习吧www.web2bar.cn)。在编写后台管理版块期间。由于是文章站,列表页面会比较多。每个列表显示基本一样,功能包括:单击选择一行;单击已经选择的行实现取消选择;被选中的行变色(颜色可以设置);双击可以实现服务器事件处理。如果每个列表都一一去编写,当然也可以达到目的。但像我这样的懒人就想着去网上找个现成的控件拖拉一下最好。不过找了很多,也下载了很多,都不太合意。不是达不到要求就是功能太过强大界面太过复杂。最后只能硬着头皮自己扩展一个了。
首先新建一个类WebBarGridView(名字随意)并继承自GridView。
public class WebBarGridView : GridView
什么?你说为什么要继续GridView。因为我们要扩展它,添加我们自己想要的新功能。当然你也可以直接继承Control。
接下来为类定义几个公开属性和几个私有变量,代码如下:
复制内容到剪贴板
代码:
private HtmlInputCheckBox cb;      //各行前面的多选框
        private Button HideButton = new Button();//隐藏按钮用于引发事件,后面会说到
[Browsable(true)]
        [Category("Appearance")]
        [Description("隔行背景色(单号行的背景)")]
        public Color SingleBackGroundColor
        {
            get
            {
                return ViewState["SingleBackGroundColor"] != null ? (Color)ViewState["SingleBackGroundColor"] : Color.Empty;
            }
            set
            {
                ViewState["SingleBackGroundColor"] = value;
            }
        }
        [Browsable(true)]
        [Category("Appearance")]
        [Description("隔行背景色(双号行的背景)")]
        public Color DoubleBackGroundColor
        {
            get
            {
                return ViewState["DoubleBackGroundColor"] != null ? (Color)ViewState["DoubleBackGroundColor"] : Color.Empty;
            }
            set
            {
                ViewState["DoubleBackGroundColor"] = value;
            }
        }
        [Browsable(true)]
        [Category("Appearance")]
        [Description("选中行背景色")]
        public Color ClickBackGroundColor
        {
            get
            {
                return ViewState["ClickBackGroundColor"] != null ? (Color)ViewState["ClickBackGroundColor"] : Color.Empty;
            }
            set
            {
                ViewState["ClickBackGroundColor"] = value;
            }
        }
这里我们用ViewState保存值是为了回发时值还在(保持状态)。属性的做用在Description中都已经说明,这里就不再重复了。
接下来就是各个功能的具体实现了,在实现这些功能之前先初始化GridView并添加全选模板列:
复制内容到剪贴板
代码:
protected override void OnInit(EventArgs e)
        {
            this.HideButton.Click += new EventHandler(this.OnClick);
            TemplateField gc = new TemplateField();
            gc.HeaderText = "<input type='checkbox' id='cbAll' onclick='checkAll(this.form);' />全选";
            this.Columns.Insert(0, gc);
            base.OnInit(e);
        }
好了,现在开始实现具体的功能
一.现在先来看隔行背景色的实现。这里我们重写OnRowDataBound方法代码如下:
复制内容到剪贴板
代码:
protected override void OnRowDataBound(GridViewRowEventArgs e)
        {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    if (e.Row.RowIndex != -1)
                    {
                        if (e.Row.RowIndex % 2 == 0) { e.Row.BackColor = this.SingleBackGroundColor; } else { e.Row.BackColor = this.DoubleBackGroundColor; }
                    }
                }
            base.OnRowDataBound(e);
        }
主要代码:if (e.Row.RowIndex % 2 == 0) { e.Row.BackColor = this.SingleBackGroundColor; } else { e.Row.BackColor = this.DoubleBackGroundColor; }。单行双行设置不同的背景色。this.SingleBackGroundColor和this.DoubleBackGroundColor就是前面定义的属性。
二.点击行任意位置选择行并改变背景色,点击已选行取消选择
思路:在行上添加单击事件触发Javascrip函数(函数功能:改变行背景色,改变行前面复选框选择状态)
思路有了,就可以开始写程序了。因为要用到Javascript,所以先把script导出。这里我选择重写OnPreRender方法导出所有要用到的脚本.代码如下:
复制内容到剪贴板
代码:
protected override void OnPreRender(EventArgs e)
        {
            this.CreateSelectedRowItems();
            string js = @"<script type='text/javascript'>
                          function checkOne(checkBoxId,row,rowIndex)
                          {
                            if(document.getElementById(checkBoxId)==null){return;}
                            if(document.getElementById(checkBoxId).checked==true)
                            {
                                document.getElementById(checkBoxId).checked=false;
                                if(rowIndex=='1')
                                {
                                    row.style.backgroundColor='" + ColorTranslator.ToHtml(DoubleBackGroundColor) + @"';
                                }
                                else
                                {
                                    row.style.backgroundColor='" + ColorTranslator.ToHtml(SingleBackGroundColor) + @"';
                                }
                            }
                            else
                            {
                                document.getElementById(checkBoxId).checked=true;
                                row.style.backgroundColor='" + ColorTranslator.ToHtml(ClickBackGroundColor) + @"';
                            }
                           
                          }
                          function checkOneByBoxClick(checkBox,row,rowIndex)
                          {
                            if(checkBox==null){return;}
                            if(checkBox.checked==true)
                            {
                                checkBox.checked=false;
                              
                            }
                            else
                            {
                                checkBox.checked=true;
                            }
                           
                          }
                        function checkAll(form)
                        {
                          for (var i=0;i<form.elements.length;i++)
                          {
                              var e = form.elements[i];
                              if (e.name != 'cbAll')
                              {
                                e.checked = form.cbAll.checked;
                              }
                          }
                        }
                        function dblClick(rowIndex,objHiddenId)
                        {
                          document.getElementById(objHiddenId).value=rowIndex;
                          __doPostBack('" + this.ID + @":HideButton','');
                        }
                        </script>";
            this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "ClientScript", js);
            base.OnPreRender(e);
        }
下面是CreateSelectedRowItems()方法代码,这个方法作用是给控件加入双击事件要用到的隐藏按钮和隐藏值域。
复制内容到剪贴板
代码:
protected void CreateSelectedRowItems()
        {
            if (this.Rows.Count > 0)
            {
                HtmlInputHidden hdSelectedRowId = (HtmlInputHidden)this.FindControl("hdSelectedRowId");
                if (hdSelectedRowId == null)
                {
                    hdSelectedRowId = new HtmlInputHidden();
                    hdSelectedRowId.ID = "hdSelectedRowId";
                    this.Controls.Add(hdSelectedRowId);
                }
                if (((Button)this.FindControl("HideButton")) == null)
                {
                    this.HideButton.ID = "HideButton";
                    this.HideButton.Width = 0;
                    this.Controls.Add(this.HideButton);
                }
            }
        }
现在脚本已经全部导出了,再给各行前面加上一个复选框并为该复选框加上单击触发选择功能的脚本:
复制内容到剪贴板
代码:
protected override void OnRowCreated(GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                cb = new HtmlInputCheckBox();
                cb.ID = "cb" + e.Row.RowIndex.ToString();
                cb.Value = e.Row.RowIndex.ToString();
                cb.Attributes["onclick"] = "checkOneByBoxClick(this,this.parent,'" + (e.Row.RowIndex % 2).ToString() + "');";
                e.Row.Cells[0].Controls.Add(cb);
            }
            base.OnRowCreated(e);
        }
脚本和选择框都已经加好了,接下来要做的事就是在行上加单击触发刚才导出的脚本。还记得前面重写的OnRowDataBound方法来改变单双行色不同吧。现在我们要在这个方法里加入单击触发脚本:
e.Row.Attributes["onclick"] = "checkOne('" + e.Row.ClientID.ToString() + "_cb" + e.Row.RowIndex.ToString() + "',this,'" + (e.Row.RowIndex % 2).ToString() + "');";
这句代码功能就是调用脚本的一个函数并传给单前行的值。这样脚本就可以选中这一行了。
到现在为止,我们已经基本实现了
a.隔行色(颜色可自定义)
b.点击行任意位置选择行
c.点击已选中行任意位置取消选择
d.选中行变色(颜色可自定义)
e.多选全选功能
还剩下双击事件功能。这里我们还是在OnRowDataBound添加代码:
e.Row.Attributes["ondblclick"] = "dblClick('" + e.Row.RowIndex.ToString() + "','" + this.ClientID + "_hdSelectedRowId')";
这行代码功能是触发了隐藏按钮的回发事件。因为我们在OnInIt中已经添加了隐藏按钮的响应事件,这样我们就可以实现双击一行响应服务器事件功能
this.HideButton.Click += new EventHandler(this.OnClick);

到现在为止所有功能基本已经实现,但当我们多选行或双击行时。怎么才能知道选择或双击的行号呢。
先看返回多选行号的自定义公开方法:
复制内容到剪贴板
代码:
public string[] SelectRows()
        {
            string selectIndex = "";
            foreach (GridViewRow row in this.Rows)
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    HtmlInputCheckBox cb = (HtmlInputCheckBox)row.Cells[0].FindControl("cb" + row.RowIndex.ToString());
                    if (cb == null) continue;
                    if (cb.Checked)
                    {
                        selectIndex += "," + cb.Value;
                    }
                }
            }
            if (selectIndex!="") { selectIndex = selectIndex.Substring(1); } else { return null; }
            string[] re = selectIndex.Split(char.Parse(","));
            return re;
        }
再就是双击一行时的行号的属性:
复制内容到剪贴板
代码:
[Description("双击事件后取出该行的行号")]
        public int SelectRowIndex
        {
            get
            {
                int index = -1;
                try
                {
                    HtmlInputHidden hidden = (HtmlInputHidden)this.FindControl("hdSelectedRowId");
                    index = int.Parse(hidden.Value);
                }
                catch
                {
                    index = -1;
                }
                return index;
            }
            set
            {
                try
                {
                    HtmlInputHidden hidden = (HtmlInputHidden)this.FindControl("hdSelectedRowId");
                    hidden.Value = value.ToString();
                }
                catch
                {
                    base.SelectedIndex = value;
                }
            }
        }
分享到:
评论

相关推荐

    GridView实现多选,全选,反选功能

    在很多场合,我们需要实现GridView的多选、全选和反选功能,这在构建诸如联系人选择、图片选择等场景时非常实用。本篇文章将详细讲解如何在Android中实现GridView的这些高级功能。 首先,我们需要理解GridView的...

    GridView实现多选

    在某些场景下,我们可能需要实现GridView的多选功能,比如在图片选择、联系人选择等应用中。本篇文章将深入讲解如何在Android中通过GridView实现多选,并结合具体的项目样式进行探讨。 一、GridView的基础知识 1. ...

    gridview选中变色实现方法,.net

    通过以上介绍,我们了解到如何在.NET中使用ASP.NET的GridView控件实现行选中变色的效果。这种方法简单有效,不仅提高了用户的交互体验,也为应用程序增添了更多的交互性。开发者可以根据实际需求灵活调整样式和功能...

    GridView的多选操作

    要实现GridView的多选,我们需要维护一个选中状态的集合,例如ArrayList。当用户点击某个item时,更新对应Checkbox的状态,并同步到状态集合。同时,可以添加一个“全选”按钮,一键选中所有item。此外,还可以提供...

    gridview的多选效果

    标题"gridview的多选效果"指的是在GridView中实现用户可以同时选择多个项目的功能。这种功能在很多应用中都有需求,例如批量删除、批量操作等。下面我们将详细探讨如何实现GridView的多选效果。 1. GridView的基本...

    在GridView中实现单选或多选功能

    这篇博客“在GridView中实现单选或多选功能”主要讲解了如何在GridView中添加单选和多选功能,这对于提升用户体验和增加应用交互性至关重要。 1. GridView基础: GridView继承自AbsListView,通过Adapter来填充...

    gridview多选

    "gridview多选"这个话题就是关于如何在GridView中实现多选功能,并在用户选择后能保存选中的项内容。 1. ** GridView的多选机制**: GridView本身并不支持多选模式,所以需要我们自定义或借助其他库来实现。通常,...

    GridView控件中实现跨页面多选

    然而,如果想要实现跨页面的多选,我们需要额外的工作来扩展其功能。 1. **启用多选**:默认情况下,GridView不支持多选。要启用多选,我们需要在GridView的`&lt;asp:GridView&gt;`标签中设置`AllowMultiSelect="true"`...

    GridView实现漂亮的多选效果

    本篇文章将深入探讨如何使用GridView实现漂亮的多选效果,以便用户可以方便地选择多个项目。 首先,我们需要了解GridView的基本用法。GridView继承自AbsListView,它会在垂直方向上滚动,并将子视图排列成行和列。...

    android gridview多选删除

    - 配置GridView:在XML布局文件中添加GridView元素,并设置属性如columnWidth(列宽)、horizontalSpacing(水平间隔)、verticalSpacing(垂直间隔)等。 - 数据绑定:通常通过Adapter类(如BaseAdapter、...

    C#_winform_GridView_CheckBox_多选_全选

    "C#_winform_GridView_CheckBox_多选_全选"这个主题就专门探讨了如何在WinForm的GridView中实现复选框的多选和全选功能。 首先,我们需要理解GridView的基本用法。GridView是.NET Framework中的System.Windows....

    GridView实现多张图片被选中的效果

    本教程将详细介绍如何利用GridView实现多张图片的选中效果,为用户提供一种选择多个图像的交互方式。 首先,我们需要理解GridView的基本用法。GridView继承自AbsListView,它会自动创建并管理子视图(ImageView或...

    Gridview用法大总结

    1:在Gridview中无须编写后台代码,直接实现增除删改 2:在Gridview中添加新记录 3:在Gridview中实现编辑和更新操作 4:在Gridview中实现一次性更新所有记录 5:在Gridview中固定表头的实现 6:在...

    Gridview用法大总结配 实例(源码)说明

    1:在Gridview中无须编写后台代码,直接实现增除删改 2:在Gridview中添加新记录 3:在Gridview中实现编辑和更新操作 4:在Gridview中实现一次性更新所有记录 5:在Gridview中固定表头的实现 6:在...

    gridview【支持多选】

    在这个多选的GridView中,适配器还需要处理选中状态,通常通过在数据模型中添加一个选择标志来实现。 3. **多选模式(MultiChoice Mode)**: GridView支持单选和多选模式。要启用多选,需要在GridView上设置`...

    GridView用法总结大全

    1:在Gridview中无须编写后台代码,直接实现增除删改 2:在Gridview中添加新记录 3:在Gridview中实现编辑和更新操作 4:在Gridview中实现一次性更新所有记录 5:在Gridview中固定表头的实现 6:在...

    GridView长按多选

    综上所述,"GridView长按多选"的实现涉及到Android事件监听、Adapter机制、数据模型与视图的绑定等多个知识点。解决数据源与Bean文件不匹配问题的关键在于理解Adapter如何工作,并确保数据模型与视图之间的对应关系...

    技术专题:详解GridView七十二般绝技(共9讲)

    可以通过设置SelectMode属性实现单选或多选行,结合RowSelected事件实现选定行的处理逻辑。 7. 高级功能: - 荷载状态:GridView在页面回发时能保持其状态,以提供流畅的用户体验。 - 行事件:如RowCreated、...

    android 实现GridView多选效果

    在使用 GridView的时候,有时需要多选上面显示的类容,比如批量删除上面显示的图片,批量上传图片等。这个时候我们可以使用层叠图来实现,当用户点击item时候,会多一个打钩的图片出来,给用户提示,他选择了该项。

    android gridview嵌套RecyclerView实现多选功能

    总之,实现Android GridView嵌套RecyclerView并支持多选功能需要综合运用Android的布局管理、事件处理、数据绑定和性能优化等多个方面。这个过程可能较为复杂,但通过良好的代码组织和设计模式,可以有效地解决这一...

Global site tag (gtag.js) - Google Analytics