• EXTJS学习系列提高篇:第一篇(转载)作者殷良胜,用EXT2.2+vs.2008.net+C#动态生成GridPanel


    简单介绍:

    本示例主要用EXT2.2+vs.2008.net+C#+sql Server 2005解决GridPanel动态生成数据列,以减免在Html页面里静态配置数据列所带来的麻烦.为了大家更好的更方便的使用本示例,就附加了一个功能:只要添加本地的数据库连接,选择数据库里面的表,就可以对代码进行测试. 

    功能:

    1,动态生成数据列,不用手动在ColumnModel里配置

    2,根据输入的数据库连接字符串动态生成ComboBox数据表名,然后直接根据表名就可以实现浏览本地的数据表,

    3,实现分页

    环境:

    1,EXT2.2版本

    2,vs.net2008+C#

    3,sql Server 2005

    下面是项目的文件图

    截图:

    首页

    次页

    源代码:

    <一>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"/><%--顺序1--%>
        <script type="text/javascript" src="ExtBase/ext-base.js"></script> <%--顺序2--%>
        <script type="text/javascript" src="ExtBase/ext-all.js"></script> <%--顺序3--%>
        <script type="text/javascript" src="ExtBase/ext-lang-zh_CN.js"></script><%--顺序4--%>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <div id="div1"></div>
        <div id="panel_id"></div>
        <script type="text/javascript">
        var table_Name;
        var panel;
        var data;
        var grid;
        var combobox;
        var URLSTR;
        function DataColumn()
        {
            this.fields = '';
            this.columns = '';      
            this.addColumns=function(name,caption)
            {
                if(this.fields.length > 0)
                {
                    this.fields += ',';
                }
                if(this.columns.length > 0)
                {               
                    this.columns += ',';
                }           
                this.fields += '{name:"' + name + '"}';
                this.columns += '{header:"' + caption + '",dataIndex:"' + name + '",100,sortable:true}';
            };
        }
       function DataGrid(URL)
       {
            var cm = new Ext.grid.ColumnModel(eval('([' + data.columns + '])'));
            cm.defaultSortable = true;
            var fields = eval('([' + data.fields + '])');
            var newStore = new Ext.data.Store
            ({
                    proxy:new Ext.data.HttpProxy({url:URL}),
                    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",renderTo:"grid_div",
                    store:newStore,
                    frame:false,
                    border:true,                   
                    layout:"fit",  
                    pageSize:16,   
                    autoWidth:true,
                    height:400,
                    viewConfig:{forceFit:true},
                    bbar:pagingBar
            }); 
        }   
       
        function MakePanel()
        {
            this.panel_def = new Ext.Panel
            ({
                layout:"fit",
                border:true,
                frame:true,
                title:"数据浏览(请在下面输入数据库连接串:)",
                autoWidth:true,
                height:500,
                id:"Viewport_ID",
                renderTo:"panel_id",
                tbar:
                [
                    '',
                    '服务器名:',{xtype:'field',id:'dbServerID',100,value:"BK5RZVXGSM78C2T"},
                    '',
                    '用户名:',{xtype:'field',id:'dbUIDID',50,value:"sa"},
                    '',
                    '密码:',{xtype:'field',id:'dbPasswordID',50,value:"0"},
                    '',
                    '数据库名:',{xtype:'field',id:'dbNameID',100,value:"Frog"},
                    '',
                    {text:'确定',pressed:true,handler:event_click_enter,tooltip:"查看数据库连接是否正确"},
                    '',
                    '<div id="hello"></div>',
                    '',
                    {text:"<--选择表名",handler:event_select_table,id:"SelectTableID",disabled:false}
                ],
                html: '<div id="grid_div"></div>'                   
            });
        }   
        function event_select_table()
        {
            if(!Ext.get("ComboBox_ID"))
            {
                Ext.Msg.alert("警告消息","请先选择数据库!");return;
            }
            var tableName = Ext.util.Format.trim(Ext.get("ComboBox_ID").getValue());
            if(tableName==""||tableName=="请选择表名")
            {
                Ext.Msg.alert("警告消息","请选择表名!");return;
            }
            if(!table_Name)
            {       
                table_Name = tableName;
            }
            else if(table_Name==tableName)
            {
                return;
            }
            else
            {
                if(grid.gridPanel)
                {
                    grid.gridPanel.destroy();           
                    data.fields = '';
                    data.columns = '';
                }
                data.fields = '';
                data.columns = '';
                table_Name = tableName;           
            }
           
            data = new DataColumn(); 
            Ext.Ajax.request
            ({
                 url:"
    JsonData.aspx?param=initDataColumnName&tableName="+tableName,

                 success:function(response,option)
                 {                
                     if(response.responseText=="")
                     {
                        Ext.Msg.alert("提示消息","当前所选中的表-->"+tableName+"<--可能没有数据!");return;
                     }
                     var res = Ext.util.JSON.decode(response.responseText);                  
                     for(var i=0;i<res.length;i++)
                     {
                         for(var p in res[i])
                         {
                            data.addColumns(p,p);
                         }
                     }                 
                     grid = new DataGrid("JsonData.aspx?param=initData&tableName="+tableName); 
                 },
                 failure:function()
                 {
                    Ext.Msg.alert("消息","查询出错---->请打开数据库查看数据表名字是否正确");
                 }
            });
        }
        function event_click_enter()
        {
            var dbServer = Ext.get("dbServerID").getValue();
            var dbUID = Ext.get("dbUIDID").getValue();
            var dbPassword = Ext.get("dbPasswordID").getValue();
            var dbName = Ext.get("dbNameID").getValue();
           
            var format = Ext.util.Format;
            if(format.trim(dbServer)=="")
            {
                Ext.Msg.alert('警告消息','服务器名称不能够为空');return;
            }
            if(format.trim(dbUID)=="")
            {
                Ext.Msg.alert('警告消息','用户登陆ID不能够为空');return;
            }
            if(format.trim(dbName)=="")
            {
                Ext.Msg.alert('警告消息','数据库名称不能够为空');return;
            }
            var urlStr = "JsonData.aspx?"+"param=initValidateDB"+

                             "&dbServerID="+dbServer+

                             "&dbUIDID="+dbUID+

                             "&dbPasswordID="+dbPassword+

                             "&dbNameID="+dbName;        
            if(!combobox)
            {
                combobox = new MakeComboBox(urlStr);  //addField 
            }
            else
            {
                if(URLSTR!=urlStr)
                {
                    combobox.comboBox.destroy();
                    combobox = new MakeComboBox(urlStr);
                }           
            }
            URLSTR = urlStr;
            Ext.Msg.alert('提示消息','现在请选择表名');
        }
        function MakeComboBox(URL)
        {    
            var store = new Ext.data.Store
            ({
                    proxy: new Ext.data.HttpProxy({url:URL}), // 数据源               
                    reader: new Ext.data.JsonReader({},[{name: 'TableName'}])// 如何解析
            });
            store.load();
            this.comboBox = new Ext.form.ComboBox
            ({      
                    id:"ComboBox_ID",
                    renderTo:"hello",
                    editable:false,
                    store:store,
                    emptyText:'请选择表名',               
                    typeAhead: true,
                    triggerAction: 'all',
                    valueField:'TableName', 
                    displayField: 'TableName',
                    selectOnFocus:true,               
                    200,
                    resizable:true
                             
            });           
        }
        function  loader()
        {
            Ext.QuickTips.init();
            MakePanel();       
        }
        Ext.onReady(loader);
        </script>
        </div>
        </form>
    </body>
    </html>

    <二>后台代码:

    using Newtonsoft.Json;//这个文件必须,请在网上下载,并在项目里对它引用,其他的名字空间省略
    public partial class GridPanel_JsonData : System.Web.UI.Page
    {
        //初始化连接字符串
        string dbDtr = "server={0};database={1};uid={2};pwd={3}";
        protected void Page_Load(object sender, EventArgs e)
        {
            string param = Convert.ToString(Request["param"]);

            #region 验证数据库连接是否正确,如果正确还需要返回该数据库连接下的所有的表的名称       
            if(param=="initValidateDB")
            {
                string dbServerID = Convert.ToString(Request["dbServerID"]);
                string dbUIDID = Convert.ToString(Request["dbUIDID"]);
                string dbPasswordID = Convert.ToString(Request["dbPasswordID"]);
                string dbNameID = Convert.ToString(Request["dbNameID"]);
                string dbs = String.Format(dbDtr, dbServerID, dbNameID, dbUIDID, dbPasswordID);          
                Session["DBS"] = dbs;           
                Access.connstring = Convert.ToString(Session["DBS"]);
                string sql = String.Format("select [Name] from  {0}..sysobjects WHERE [type] IN (N'U')", dbNameID);
                DataSet ds = Access.GetDataSet(sql);
                if (ds != null && ds.Tables[0].Rows.Count > 0)
                {
                    List<Hashtable> testList = new List<Hashtable>();
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        Hashtable ht = new Hashtable();
                        DataRow row = ds.Tables[0].Rows[i] as DataRow;
                        ht["TableName"] = Convert.ToString(row["Name"]);
                        testList.Add(ht);
                    }
                    string json = JavaScriptConvert.SerializeObject(testList);
                    Response.Write(json);
                }
            }
            #endregion

            #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 

            //绑定数据列
            if (param == "initDataColumnName")
            {
                string tableName = Convert.ToString(Request["tableName"]);
                GetDataColumnName(tableName);
            }             
          
            //绑定数据
            if (param == "initData")
            {
                string tableName = Convert.ToString(Request["tableName"]);
                Bind_Data(field, asc_desc, pagesize, start, tableName);
            }     
        }
      
        private void GetDataColumnName(string tableName)
        {
            NewMethod();
            DataSet ds = Access.GetDataSet(String.Format("select top 1 * from {0}",tableName));
            //只要ds不为null,则不管该表是否有数据,都有数据列生成
            if (ds != null)
            {
                List<Hashtable> htList = new List<Hashtable>();
                foreach (DataColumn col in ds.Tables[0].Columns)
                {
                    Hashtable ht = new Hashtable();
                    ht.Add(col.ColumnName, col.ColumnName);
                    htList.Add(ht);
                }
                try
                {
                    string json = JavaScriptConvert.SerializeObject(htList);
                    Response.Write(json);
                }
                catch (Exception ee)
                {
                    string error = ee.Message;
                }
            }
            else
            {
                Response.Write("");
            }
        }

        private void Bind_Data(string field, string asc_desc, int pagesize, int start, string tableName)
        {
            NewMethod();//作用是获取动态生成的数据库连接字符串
            DataSet ds = Business.GetPagingData(field, asc_desc, pagesize, start, tableName);
            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                GetJsonData(ds,tableName);
            }
            else
            {
                Response.Write("");
            }
        }

        private void NewMethod()
        {
            if (Session["DBS"] != null && Convert.ToString(Session["DBS"]) != "")
            {
                Access.connstring = Convert.ToString(Session["DBS"]);
            }
            else
            {
                Response.Write(""); return;
            }
        }
        private void GetJsonData(DataSet ds, string tableName)
        {
            NewMethod();
            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(String.Format("Select count(*) from {0}",tableName));
            string json = "{totalPorperty:" + count + ",result:" + JavaScriptConvert.SerializeObject(hashList) + "}";
            Response.Write(json);
        }
    }

    <三>分页功能单独实现

    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;
            }
        }
    }

    版权说明

      如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
      作      者:温景良
      文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

  • 相关阅读:
    [转]敏捷软件开发 需求分析
    Windows服务控制命令SC
    [转]敏捷测试工程师的十条法则
    大道至简:如何准确把握趋势 一
    Sqlserver xml 类型操作
    微软Teched2010大会一日游记
    [转]任务、用例、用户故事和场景
    ASUS TF600T上手体验
    Windows 8的各种小发现——不断更新中
    Surface Pro电磁笔故障
  • 原文地址:https://www.cnblogs.com/wenjl520/p/1325561.html
Copyright © 2020-2023  润新知