【原】提高篇:第三篇,在GridPanel上单击右键显示菜单的制作

 简单介绍:

本示例主要用EXT2.2+vs.2008.net+C#+sql Server 2005实现在GridPanel上单击右键显示菜单,在单击某个菜单项后弹出一个窗口用于处理具体的操作

功能:

1,生成GridPanel

2,在GridPanel上单击右键显示菜单

3,实现分页

环境:

1,EXT2.2版本

2,vs.net2008+C#

3,sql Server 2005

说明:项目所需要的具体文件以及后台文件都可以在前面的2个例子中下载

对行数据的编辑没有具体实现,仅仅是展示如何单击右键显示菜单并且弹出相应的窗口,没有对具体的数据后台处理

截图:

1,在某行上点击右键,出现下图所示的菜单

2,在菜单上点某个菜单项后出现下图所示的窗口

下面是源代码

1,页面文件:Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="GridPanel_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 runat="server">
    <title>无标题页</title>
    <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css"/>
    <script type="text/javascript" src="ExtBase/ext-base.js"></script>
    <script type="text/javascript" src="ExtBase/ext-all.js"></script>
    <script type="text/javascript" src="ExtBase/ext-lang-zh_CN.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>  
    <div id="panel_id"></div>
    <script type="text/javascript">
   var grid;  
   function DataGrid()
   {
        var cm = new Ext.grid.ColumnModel
        ([
            {header: "编号", width: 120, dataIndex: 'ID', sortable: true},
            {header: "标题", width: 180, dataIndex: 'Title', sortable: true},
            {header: "作者", width: 115, dataIndex: 'Author', sortable: true},
            {header: "来源", width: 100, dataIndex: 'Source', sortable: true},
            {header: "日期", width: 100, dataIndex: 'PostDate', sortable: true}
        ]);  
        var titleInfo = "编辑数据";    
        var fields = [{name:"ID"},{name:"Title"},{name:"Author"},{name:"Source"},{name:"PostDate"}];
        var newStore = new Ext.data.Store
        ({
                proxy:new Ext.data.HttpProxy({url:"JsonData.aspx?param=initData"}),
                reader:new Ext.data.JsonReader({totalProperty:"totalPorperty",root:"result",fields:fields})
        }); 
        newStore.load({params:{start:0,limit:16}});
        var pagingBar = new Ext.PagingToolbar
        ({
                displayInfo:true,
                emptyMsg:"没有数据显示",
                displayMsg:"显示从{0}条数据到{1}条数据,共{2}条数据",
                store:newStore,
                pageSize:16
        });       
        this.gridPanel = new Ext.grid.GridPanel
        ({
                cm:cm,
                id:"grid_panel",
                title:titleInfo,
                store:newStore,
                frame:false,
                border:true,                   
                layout:"fit",  
                pageSize:16,   
                autoWidth:true,
                height:400,
                clicksToEdit:1,
                viewConfig:{forceFit:true},
                bbar:pagingBar
        });
        this.gridPanel.on("rowcontextmenu",open_rowcontextmenu);
    }   
    function open_rowcontextmenu(grid,rowIndex,e)
    {
        e.preventDefault();
        var menus = new Ext.menu.Menu
        ([
            {
                xtype:"button",text:"编辑",pressed:true,icon:"imgMenus/3.png",
                handler:function(){Edit(grid,rowIndex,e ,"编辑");}
            },
            {
                xtype:"button",text:"删除",pressed:true,icon:"imgMenus/3.png",
                handler:function(){Edit(grid,rowIndex,e ,"删除");}
            }    
        ]);
        menus.showAt(e.getPoint());
    }
    function Edit(grid,rowIndex,e,titleInfo)
    {   
        var record = grid.getStore().getAt(rowIndex);
        var currID =    record.data.ID;
        var currAuthor =  record.data.Author;
        var currTitle =  record.data.Title;
        var currSource =  record.data.Source;
        var currPostDate =  record.data.PostDate;
       
        var p = new Ext.FormPanel
        ({
             frame:true,labelWidth:36,
             items:
              [
                  {xtype:"hidden",id:"ID",width:201,value:currID},
                  {xtype:"textfield",fieldLabel:"标题",id:"Title",width:201,value:currTitle},
                  {xtype:"textfield",fieldLabel:"作者",id:"Author",width:200,value:currAuthor},
                  {xtype:"textfield",fieldLabel:"来源",id:"Source",width:201,value:currSource},
                  {xtype:"datefield",fieldLabel:"日期",id:"PostDate",width:201,value:currPostDate,format:"Y年m月d日"}
              ]
        });
       
        var win = new Ext.Window
        ({
              title:titleInfo+"窗口",autoHeight:true,width:300,resizable:false,buttonAlign:"center", modal:true,//height:300,         
              items:[p],
              bbar:
              [                
                  {xtype:"button",text:"确定"+titleInfo,handler:function(){Edit_Sub(win,titleInfo);}},
                  '','',
                  {xtype:"button",text:"关闭",handler:function(){win.destroy();}}
              ]
        });
        win.show();
    }
    function Edit_Sub(winParam,titleInfo)
    {
       var currID =  Ext.getCmp("ID").getValue();
       winParam.destroy();
       if(titleInfo=="删除")
       {
            Ext.Msg.alert("消息提示","删除成功");
            //具体删除代码自己实现
       }
       else
       {
            Ext.Msg.alert("消息提示","编辑成功");
            //具体修改代码自己实现
       }      
    }
    function MakePanel(obj)
    {
        this.panel_def = new Ext.Panel
        ({
            layout:"fit",
            border:true,
            frame:true,
            title:"数据浏览",
            autoWidth:true,
            height:500,
            id:"Viewport_ID",
            renderTo:"panel_id",
            items:[obj.gridPanel]                   
        });
    } 
    function  loader()
    {
        Ext.QuickTips.init();
        grid = new DataGrid();
        MakePanel(grid);  
    }
    Ext.onReady(loader);
    </script>
    </div>
    </form>
</body>
</html>

2,后台cs文件:JsonData.aspx.cs

 

说明:数据表可以使用以下语句生成即可

USE [Test]
GO
/****** 对象:  Table [dbo].[ceshitwo]    脚本日期: 08/26/2008 13:04:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ceshitwo](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Title] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [Author] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [Source] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [PostDate] [datetime] NULL CONSTRAINT [DF_ceshitwo_PostDate]  DEFAULT (getdate()),
 CONSTRAINT [PK_ceshitwo] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
 

<三>分页功能单独实现

public class Business
{  
    public static DataSet GetPagingData(string field, string asc_desc, int pagesize, int start,string tableName)
    {
        string sql = "WITH MOVIES AS ( " +
                    " SELECT ROW_NUMBER() OVER " +
                    " (ORDER BY " + field + "   "  +  asc_desc  +  " ) AS Row," +
                    " *" +
                    " FROM " + tableName + " )" +
                    " SELECT *" +
                    " FROM MOVIES " +
                    " WHERE Row between (@start-1)* @pagesize+1  and @start*@pagesize";
        SqlParameter[] prams =
        {
            new SqlParameter("@start",start),
            new SqlParameter("@pagesize",pagesize)
        };
        return Access.GetDataSet(sql, prams);
    }
}

<四>数据库访问层:

public class Access
{
    public Access()
    {    }
    public static string connstring = "";  

    private static void CreateCommand(SqlConnection conn, SqlCommand cmd, string cmdText, params SqlParameter[] prams)
    {
        conn.ConnectionString = Access.connstring;
        if (conn.State == ConnectionState.Closed)
            conn.Open();
        cmd.Connection = conn;
        cmd.CommandText = cmdText;
        if (prams != null)
        {
            foreach (SqlParameter p in prams)
                cmd.Parameters.Add(p);
        }
    }
    public static DataSet GetDataSet(string cmdText)
    {
        return GetDataSet(cmdText,null);
    }
    public static DataSet GetDataSet(string cmdText, params SqlParameter[] prams)
    {
        using (SqlConnection conn = new SqlConnection())
        {
            SqlCommand cmd = new SqlCommand();
            CreateCommand(conn, cmd, cmdText, prams);
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(ds);
            cmd.Parameters.Clear();
            return ds;
        }           
    }
    public static int? GetCount(string cmdText)
    {
        return GetCount(cmdText, null);
    }
    public static int? GetCount(string cmdText,params SqlParameter[] prams)
    {
        using (SqlConnection conn = new SqlConnection())
        {
            SqlCommand cmd = new SqlCommand();
            CreateCommand(conn, cmd, cmdText, prams);
            int? count;
            count = Convert.ToInt32( cmd.ExecuteScalar() );
            cmd.Parameters.Clear();
            return count;
        }
    }
}

using Newtonsoft.Json;
public partial class GridPanel_JsonData : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        #region 分页参数
        int pagesize = 5;
        int start = 1;
        string field, asc_desc;
        if (string.IsNullOrEmpty(Request["sort"]))
        {
            field = "ID";
            asc_desc = "ASC";
        }
        else
        {
            field = Request["sort"];
            asc_desc = Request["dir"];
        }
        if (!string.IsNullOrEmpty(Request["limit"]))
        {
            pagesize = int.Parse(Request["limit"]);
            start = int.Parse(Request["start"]);
        }
        start = start / pagesize;
        start += 1;
        #endregion
        string param = Convert.ToString(Request["param"]);
        if (param == "initData")
        {
            Bind_Data(field, asc_desc, pagesize, start, "ceshitwo");
        }
    }

    private void Bind_Data(string field, string asc_desc, int pagesize, int start, string tableName)
    {
        DataSet ds = Business.GetPagingData(field, asc_desc, pagesize, start, tableName);
        if (ds != null && ds.Tables[0].Rows.Count > 0)
        {
            GetJsonData(ds);
        }
        else
        {
            Response.Write("");
        }
    }

    private void GetJsonData(DataSet ds)
    {
        List<Hashtable> hashList = new List<Hashtable>();
        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
        {
            DataRow row = ds.Tables[0].Rows[i] as DataRow;
            Hashtable ht = new Hashtable();
            foreach (DataColumn col in ds.Tables[0].Columns)
            {
                ht.Add(col.ColumnName, row[col.ColumnName]);
            }
            hashList.Add(ht);
        }
        int? count = Access.GetCount("Select count(*) from ceshitwo");
        string json = "{totalPorperty:" + count + ",result:" + JavaScriptConvert.SerializeObject(hashList) + "}";
        Response.Write(json);
    }  
}

posted @ 2008-08-26 13:10 殷良胜 阅读(1489) 评论(24)  编辑 收藏 网摘

  回复  引用    
#1楼2008-09-08 13:24 | wjl[未注册用户]
高手!看不懂上面的语句,希望你能给我做一个看看,把文件传到fhwjl@msn.com小弟在此谢过.最好是我把文件给你,你能给我添加一个页面.
  回复  引用  查看    
#2楼2008-09-09 17:54 | 求知      
老师你好!能不能给我一个给做好的文件,前台+后台,我是刚刚初学者,在单位上班,刚好需要做这些功能,没办法只好求你帮忙
  回复  引用  查看    
#3楼2008-09-09 17:57 | 求知      
完整的一组服务器端与客户端运营程序.
  回复  引用  查看    
#4楼[楼主]2008-09-10 08:19 | 殷良胜      
@求知

你好

我很抱歉

最近一段时间忙 没有上来

我已经通过邮件把数据库发送给你

代码无法通过msn上传

我已经加了你的msn

中午12点如果你有时间我传给你

工作时间不能够上msn.


  回复  引用  查看    
#5楼2008-09-10 08:37 | 求知      
谢谢你在百忙中给我解决问题,感激涕零
  回复  引用  查看    
#6楼[楼主]2008-10-30 13:05 | 殷良胜      
  回复  引用    
#7楼2008-11-14 17:22 | 陀螺[未注册用户]
我想请教下楼主,右键单击选定一行的数据,出来的数据是根据没页前面的序号rowIndex出来的,我想要的结果是比如:
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer(),
{
header:"编号",
dataIndex:"sysId",
width:10,
hidden:true
},{
header: "类别",
dataIndex: 'vendorType',
width: 80
},{
header: "简称",
dataIndex: 'vendorNo',
width: 80
},{
header: "标志",
dataIndex: 'checkFlag',
width: 60,renderer: checkFlag
}

]);
我想要sysId这个值,将这个值传到后台做为条件去查询,该怎么取啊,期待你的回复。可以发我邮箱wizards10@163.com先谢谢你

  回复  引用  查看    
#8楼[楼主]2008-11-14 21:28 | 殷良胜      
@陀螺
恩,我已经为你写了一个很详细的例子,可以看下,
提高篇:第三十篇,ext2.2打造全新功能grid系列--右键菜单第二篇

  回复  引用    
#9楼2008-11-17 10:22 | 陀螺[未注册用户]
谢谢楼主,看了你为我写的列子,我的问题解决了 ,非常感谢~~~
  回复  引用    
#10楼2009-05-04 15:15 | fanfanlyon
楼主 能发我一份 这个例子的源代码么? 因为我是新手 有些地方还不知道怎么搞。。。 谢谢 我的邮箱fanhongliang03@163.com
  回复  引用  查看    
#11楼[楼主]2009-05-04 15:30 | 殷良胜      
--引用--------------------------------------------------
fanfanlyon: 楼主 能发我一份 这个例子的源代码么? 因为我是新手 有些地方还不知道怎么搞。。。 谢谢 我的邮箱fanhongliang03@163.com
--------------------------------------------------------
当然可以。因为博客空间有限,所以很多示例的源代码不能够上传上去给大家下载。

  回复  引用    
#12楼2009-05-15 15:56 | 宇洋[未注册用户]
殷老师,能不能把JS代码加上注释。好多Javascript都不是很明白。
  回复  引用    
#13楼2009-05-22 12:05 | 沉兮
function open_rowcontextmenu(grid,rowIndex,e)
{
e.preventDefault();
var menus = new Ext.menu.Menu
([
{
xtype:"button",text:"编辑",pressed:true,icon:"imgMenus/3.png",
handler:function(){Edit(grid,rowIndex,e ,"编辑");}
},
{
xtype:"button",text:"删除",pressed:true,icon:"imgMenus/3.png",
handler:function(){Edit(grid,rowIndex,e ,"删除");}
}
]);
menus.showAt(e.getPoint());
}
function Edit(grid,rowIndex,e,titleInfo)
{
var record = grid.getStore().getAt(rowIndex);
var currID = record.data.ID;
var currAuthor = record.data.Author;
var currTitle = record.data.Title;
var currSource = record.data.Source;
var currPostDate = record.data.PostDate;

var p = new Ext.FormPanel
({
frame:true,labelWidth:36,
items:
[
{xtype:"hidden",id:"ID",width:201,value:currID},
{xtype:"textfield",fieldLabel:"标题",id:"Title",width:201,value:currTitle},
{xtype:"textfield",fieldLabel:"作者",id:"Author",width:200,value:currAuthor},
{xtype:"textfield",fieldLabel:"来源",id:"Source",width:201,value:currSource},
{xtype:"datefield",fieldLabel:"日期",id:"PostDate",width:201,value:currPostDate,format:"Y年m月d日"}
]
});
请问楼主,右键菜单中Edit函数的参数是怎么传递进去的啊,为什么这里可以这么用啊?谢谢回答

  回复  引用    
#14楼2009-05-22 17:06 | 沉兮
明白了,嘿嘿。他的参数就是上层函数传下来的吧,而上层函数是系统在执行事件是自动给的!类似于C#中的事件吧!就是JS这种语法好像真不太好,总容易搞混的,学艺不精,像楼主学习!
  回复  引用  查看    
#15楼[楼主]2009-05-22 18:36 | 殷良胜      
--引用--------------------------------------------------
沉兮: 明白了,嘿嘿。他的参数就是上层函数传下来的吧,而上层函数是系统在执行事件是自动给的!类似于C#中的事件吧!就是JS这种语法好像真不太好,总容易搞混的,学艺不精,像楼主学习!
--------------------------------------------------------
呵呵

  回复  引用    
#16楼2009-06-18 10:35 | СомёОл
老师是过在客户端排序吗?如果返回的数据是LIST c#3.0提供LINQ语言,提供LIST排序,呵呵,请问哪种排序好点呢?
  回复  引用    
#17楼2009-06-24 11:06 | shenyingfeng[未注册用户]
能把这文件发给我吗
非常感谢
我的邮箱是syfeng0103@163.com

  回复  引用  查看    
#18楼[楼主]2009-06-24 19:24 | 殷良胜      
--引用--------------------------------------------------
СомёОл: 老师是过在客户端排序吗?如果返回的数据是LIST c#3.0提供LINQ语言,提供LIST排序,呵呵,请问哪种排序好点呢?
--------------------------------------------------------
我不喜欢LINQ语言

  回复  引用  查看    
#19楼[楼主]2009-06-24 19:25 | 殷良胜      
@shenyingfeng
--引用--------------------------------------------------
shenyingfeng: 能把这文件发给我吗
非常感谢
我的邮箱是syfeng0103@163.com
--------------------------------------------------------
这个例子写得已经很详细 只要按步骤去做 相信你能够做得更好

  回复  引用    
#20楼2009-06-26 13:01 | shenyingfeng[未注册用户]
是蛮详细了,但是有些调用的地方还是不懂,我是新手,刚学Ext,也都是从你那学来的
呵呵

  回复  引用  查看    
#21楼[楼主]2009-06-26 13:07 | 殷良胜      
@shenyingfeng
今天晚上我就写个有完整功能并有详细注释的 也提供源代码下载

  回复  引用    
#22楼2009-06-27 09:44 | shenyingfeng[未注册用户]
你博客做的不错啊
我复制你的代码,为什么我显示出来只有ID这列啊,其他没的。
还有 string sql = "WITH MOVIES AS ( " +
" SELECT ROW_NUMBER() OVER " +
" (ORDER BY " + field + " " + asc_desc + " ) AS Row," +
" *" +
" FROM " + tableName + " )" +
" SELECT *" +
" FROM MOVIES " +
" WHERE Row between (@start-1)* @pagesize+1 and @start*@pagesize";
这个SQL语句不懂。

  回复  引用  查看    
#23楼[楼主]2009-06-29 06:57 | 殷良胜      
--引用--------------------------------------------------
殷良胜: @shenyingfeng
今天晚上我就写个有完整功能并有详细注释的 也提供源代码下载
--------------------------------------------------------
不好意思 周末太忙了

  回复  引用    
#24楼2009-06-29 16:40 | shenyingfeng[未注册用户]
谢谢,那我等着你的源代码哈。我觉得代码注释很重要。
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1276599




相关文章:

相关链接: