`
prec
  • 浏览: 65400 次
  • 性别: Icon_minigender_1
  • 来自: 互联网
最近访客 更多访客>>
社区版块
存档分类
最新评论

在.NET中使用简单的值绑定表达式

阅读更多

        用过JSF的,相信值绑定表达式不会太陌生。值绑定表达式就是像#{somebean.somevariable}这样简单的东东,JSF处理这样的表达式然后创建数据以便在JSF生命周期的后续阶段使用。
       使用表达式,对于.NET来说,简化了一些数据表的制作,对于复杂的表格尤其有显著效果。

一、代码介绍:

/**//*----------------------------------------------------------------
// 文件名:        table.cs
//
//    目前已经支持域绑定#{字段名}如公司名:#{productname},序列绑定#{@seq} 如sy_#{@seq}则为sy_0,sy_1,sy_2……,
//    param绑定#{@param:}如#{@param:autoid}则为地址栏传过来的autoid,自定义值#{@custom:} 如#{@custom:myval},
//    多表值域#{表名.字段名} 如#{userinfo.userid},排序列绑定@{字段名}如class="@{companyname} 表示公司名列要应用样式绑定式排序",
//    枚举绑定 如新旧程度:#{oldlevel!0:全新,1:九成新,2:八成新,3:七成新,4:五成新} 如oldlevel字段为3则显示7成新 等格式
//
//
//
// 不会飞的鱼
//----------------------------------------------------------------*/
using System;
using System.Web;
using System.Web.UI;
using System.Collections;
using System.Data;
using vista.Util.Data;

namespace ViewLogic.UI
...{

    public class table : Control
    ...{
        private IDataSource _dataSource = null;
        private IList _columnList = null;
        private string _sortDirect = null;
        private string _colname = null;
        private System.Collections.Specialized.NameValueCollection _params = null;
        private IDictionary _customvalue = null;

        public IDataSource DataSource
        ...{
            get
            ...{
                return _dataSource;
            }
            set
            ...{
                _dataSource = value;
            }
        }

        public System.Collections.Specialized.NameValueCollection Params
        ...{
            get...{return _params;}
            set...{_params = value;}
        }

        public IDictionary CustomValue
        ...{
            get...{return _customvalue;}
            set...{_customvalue = value;}
        }

        public IList ColumnList
        ...{
            get
            ...{
                if(DataSource==null)
                    return null;
                string htmlSource = ((LiteralControl) Controls[0]).Text;
                System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(htmlSource,@"#{[@w]+}");
               
                _columnList = new ArrayList(mc.Count);

                foreach(System.Text.RegularExpressions.Match m in mc)
                ...{
                    string colName = System.Text.RegularExpressions.Regex.Replace(m.Groups[0].Value,@"[#{}]","");
                    if(colName.IndexOf("@")!=0)
                    ...{
                        _columnList.Add(colName);
                    }                   
                }
                return _columnList;
            }
        }

        public string ColName
        ...{
            set ...{ _colname = value;}
        }


        public string SortDriect
        ...{
            set
            ...{
                _sortDirect = value;
            }
        }

        protected override void Render(HtmlTextWriter output)
        ...{

            if ( (HasControls()) && (Controls[0] is LiteralControl) && _dataSource!=null)
            ...{
                string htmlSource = ((LiteralControl) Controls[0]).Text;
                bool flag = true;
                int i=0;
                if(_sortDirect!=null)
                ...{
                    htmlSource = htmlSource.Replace("@{"+ _colname +"}","sortOrder"+_sortDirect);
                }

                while(_dataSource.MoveNext())
                ...{
                    DataRow dr = _dataSource.Current as DataRow;
                    i ++;
                    System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(htmlSource,@"#{[@!.,:w]+}");
                    string outstr = htmlSource;

                    foreach(System.Text.RegularExpressions.Match m in mc)
                    ...{

                        string colName = System.Text.RegularExpressions.Regex.Replace(m.Groups[0].Value,@"[#{}]","");
                        if(colName.IndexOf("@")==0)
                        ...{
                            if(colName.Trim().Equals("@seq"))
                                outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,i.ToString());
                            else if(colName.Trim().IndexOf("@param:") == 0)
                            ...{
                                string[] pars = colName.Split(':');
                                string realparam = pars[1];

                                outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,Params[realparam].ToString());
                            }
                            else if(colName.Trim().IndexOf("@custom:") == 0)
                            ...{
                                string[] customs = colName.Split(':');
                                string realcustom = customs[1];
                                if(CustomValue[realcustom] is string)
                                    outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,CustomValue[realcustom].ToString());
                                else if(CustomValue[realcustom] is IList)
                                ...{
                                    string temp = (CustomValue[realcustom] as IList)[i-1].ToString();
                                    outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,temp);
                                }

                            }
                        }
                        else if(colName.IndexOf(".")!=-1)
                        ...{                          
                            string[] colNameSplit = colName.Split('.');
                            DataTable dt = dr.Table.DataSet.Tables[colNameSplit[0]];
                            foreach(DataRow dr2 in dt.Rows)
                            ...{
                                outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,dr2[colNameSplit[1]].ToString());
                            }
                        }
                        else
                        ...{
                            if(colName.IndexOf("!")!=-1)
                            ...{
                                string[] exps = colName.Split('!');
                                string explist = exps[1];
                                string[] expitems = explist.Split(',');
                                bool fFound = false;
                                foreach(string expitem in expitems)
                                ...{
                                    string[] hashitem = expitem.Split(':');

                                    if(hashitem[0]==dr[exps[0]].ToString())
                                    ...{
                                        string realoutput = hashitem[1];
                                        outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,realoutput);
                                        flag = true;
                                        break;
                                    }
                                }
                                if(!fFound)
                                ...{
                                    outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,"");
                                }
                            }
                            else
                            ...{
                                outstr = System.Text.RegularExpressions.Regex.Replace(outstr,m.Groups[0].Value,dr[colName].ToString());
                            }
                        }

                    }
                    output.Write(outstr);
                    flag = false;
                }
               
            }
        }

       

    }   
}


 IDataSource接口,为table.cs提供数据源:

 

using System;
using System.Collections;

namespace ViewLogic.Data
...{
    /**//// <summary>
    /// IDataSource是一个通用的数据接口,有一个方法GetDataField
    /// </summary>
    public interface IDataSource : IEnumerator
    ...{
        /**//// <summary>
        /// GetDataField方法,取得指定名称域的值
        /// </summary>
        /// <param name="name">域的名称</param>
        /// <returns></returns>
        string GetDataField(string name);
    }
}
 工厂类,具体数据来源的创建,想要什么就制作什么,比如下面的DataSet,DataTable或者更多:

using System;
using System.Data;

namespace ViewLogic.Data
...{
    /**//// <summary>
    /// DataSourceFactory为工厂类,返回IDataSource接口类型
    /// </summary>
    public class DataSourceFactory
    ...{
        public DataSourceFactory()
        ...{
        }

        /**//// <summary>
        ///
        /// </summary>
        /// <param name="ds">DataSet</param>
        /// <returns></returns>
        public static IDataSource Create(DataSet ds)
        ...{
            return Create(ds.Tables[0]);
        }

        /**//// <summary>
        ///
        /// </summary>
        /// <param name="dt">DataTable</param>
        /// <returns></returns>
        public static IDataSource Create(DataTable dt)
        ...{
            return new DataList(dt);
        }
    }
}

基类:

using System;
using System.Collections;
using System.Reflection;

namespace ViewLogic.Data
...{
    /**//// <summary>
    /// DataBase 的摘要说明。
    /// </summary>
    public abstract class DataBase : IDataSource
    ...{
        public DataBase()
        ...{
        }

        /**//// <summary>
        ///
        /// </summary>
        private IEnumerator enumerator;

        /**//// <summary>
        ///
        /// </summary>
        protected IEnumerator Enumerator
        ...{
            get
            ...{
                return enumerator;
            }
            set
            ...{
                enumerator = value;
            }
        }

        IDataSource 成员#region IDataSource 成员

        /**//// <summary>
        /// GetDataField
        /// </summary>
        /// <param name="name">string</param>
        /// <returns></returns>
        public abstract string GetDataField(string name);

        #endregion

        IEnumerator 成员#region IEnumerator 成员

        /**//// <summary>
        ///
        /// </summary>
        public void Reset()
        ...{
            enumerator.Reset();
        }

        /**//// <summary>
        ///
        /// </summary>
        public object Current
        ...{
            get
            ...{
                return enumerator.Current;
            }
        }

        /**//// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public bool MoveNext()
        ...{
            return enumerator.MoveNext();
        }

        #endregion
    }
}

具体的操作:

using System;
using System.Data;

namespace ViewLogic.Data
...{
    /**//// <summary>
    /// DataList 的摘要说明。
    /// </summary>
    public class DataList : DataBase
    ...{
        protected DataList()
        ...{
        }

        /**//// <summary>
        /// DataList
        /// </summary>
        /// <param name="table">DataTable</param>
        public DataList(DataTable table)
        ...{
            this.Enumerator = table.Rows.GetEnumerator();
        }

        /**//// <summary>
        /// GetDataField
        /// </summary>
        /// <param name="name">string</param>
        /// <returns>string</returns>
        public override string GetDataField(string name)
        ...{
            if(Enumerator.Current != null)
            ...{
                DataRow row = Enumerator.Current as DataRow;
                if(row != null)
                ...{
                    return row[name].ToString();
                }
                else
                ...{
                    return null;
                }
            }
            else
            ...{
                return null;
            }
        }
    }

}
 

二、使用:

      1、准备工作:因为是自定义控件,所以要引用进来<%@  Register TagPrefix="tbl" Namespace="ViewLogic.UI" Assembly="ViewLogic"%>

     2、简单前台绑定:

<table>
        <tr>
                <td>姓名</td>
                <td>年龄</td>
        </tr>
           <tbl:table id="tbl1" runat="server">
        <tr>
                <td>#{username}</td>
                <td>#{age}</td>
        </tr>
            </tbl:table>
</table>
     对应后台绑定:

           声明:protected ViewLogic.UI.table tbl1;
           绑定:tbl1.DataSource = DataSourceFactory.Create(dt);   // dt 为 一个DataTable的实例
                       tbl1.DataBind();

            OK,可以使用了。当然,你的dt 里面要包含username和age这两个列

     3、序列绑定:

                             排名      姓名
                              1        wang
                              2        zhang
                              3            li

            而 1、2、3是图片img_1.gif,img_2.gif,img_3.gif

<table>
        <tr>
                <td>排名</td>
                <td>姓名</td>
        </tr>
           <tbl:table id="tbl1" runat="server">
        <tr>
                <td><img src="img"</td_#{@seq}.gif>
                <td>#{age}</td>
        </tr>
            </tbl:table>
</table>
         后台绑定同2的后台

        4、多表绑定:同2,只是#{表名.列名}的形式,并且,绑定的DataSet里的Table[0]可以省去表明直接写
                                  #{列名},而DataSet里的Tables[1]绑定列则必须写Table[1]的名字,比如#{tb1.age}

        5、传值绑定:
                                包括地址栏和自定义两种:

                              1)  地址栏传值:

                              前台:  如a.aspx?id=1 页面里有 <a href="test.aspx?id=#{@param:id}">查看详细</a>
                               则 <a href="test.aspx?id=1">查看详细</a>

                               后台: tbl1.Params = Request.Params;

                             2)  自定义传值:

                             前台:假设<a href="test.aspx?id=#{@custom:bookid}&year=#{@custom:year}">查看书目</a>

                             后台: Hashtable ht = new Hashtable();

                                           ht.add("bookid","1");

                                           ht.add("year","2006");

                                           也可以进行一键多值绑定:

                                          Hashtable ht = new Hashtable();

                                           ht.add("bookid","1");

                                           ArrayList ar = new ArrayList();

                                          ar.Add("2006");

                                          ar.Add("2007");

                                          ………………

                                           ht.add("year",ar);

          6、枚举绑定:

                           前台:<TD>新旧程度:#{oldlevel!0:全新,1:九成新,2:八成新,3:七成新,4:五成新}</TD>

                          后台:同2绑定。

                          如果列oldlevel 值为 3 则显示 七成新

          7、排序绑定:

                         结合我的《样式绑定驱动脚本……》一文,进行前台的排序样式绑定。

好了完成了,还是那句话,DEMO,DEMO而已,为的是发散思维,拓宽思路,当然大家完全可以自己制作这些代码,关键是思想,用.NET进行快速开发确实还有很长的路要走,asp.net的硬框架也不如J2EE的众多框架那样灵活,所以还要有天才的大家们共同研究………………

分享到:
评论

相关推荐

    .NET中的数据绑定表达式

    1. **服务器控件的属性**:可以直接在控件的属性值中使用数据绑定表达式,如上面的TextBox控件示例。 2. **页面内容**:数据绑定表达式也可以直接在页面的HTML内容中使用,例如在`&lt;div&gt;`、`&lt;p&gt;`等标签内,但这种方式...

    ASP.NET中的数据绑定

    声明式数据绑定通过在ASP.NET标记中使用控件属性来完成,如`&lt;asp:BoundField&gt;`或`("FieldName") %&gt;'&gt;`。编程式数据绑定则通过代码-behind实现,例如使用`DataSource`属性设置数据源,并调用`DataBind()`方法。 在...

    深入ASP.NET数据绑定.doc

    当在ASP.NET控件如Repeater、DetailsView、FormView和GridView中使用这些数据绑定表达式时,ASP.NET会在编译时和运行时进行一系列处理。在编译阶段,ASP.NET会解析`.aspx`文件中的所有服务器端代码,包括数据绑定...

    Web 窗体页的数据绑定表达式

    【Web 窗体页的数据绑定表达式】是ASP.NET Web开发中的一种核心特性,它允许开发者将网页上的控件属性与数据源关联起来,从而动态地显示和更新数据。这种绑定不是通过直接将控件属性与数据源连接,而是通过特定的...

    asp.net中的数据绑定

    2. 使用`表达式 %&gt;`:这被称为数据绑定表达式,可以在控件的属性中直接写入,用于在运行时计算值。这种方式常用于BoundField或TemplateField中,以便根据数据源的字段值设置控件的属性。 3. 使用数据源控件:如...

    ASP.NET数据绑定技术之数据绑定

    第三种是直接在页面中使用数据绑定表达式,如数据绑定表达式 %&gt;,并在Page_Load中调用DataBind()方法。 数据绑定表达式如("ColumnName") %&gt;用于在模板中显示数据源中某一列的值,而Bind()方法则允许双向绑定,即...

    ASP.NET框架中的数据绑定概要与数据绑定表达式的使用

    `Eval`方法在每个`td`元素中使用,显示了对应的数据列。 总结起来,ASP.NET中的数据绑定提供了一种强大且灵活的方式来处理数据和UI之间的交互。通过理解`&lt;%# %&gt;`语法,掌握`Eval`和`Bind`函数的用法,开发者可以...

    ASP.NET 2.0 数据绑定

    例如,`("ProductName") %&gt;`表示将数据源中名为“ProductName”的字段值绑定到当前控件上。 - 绑定表达式可以嵌入到HTML标记中,也可以作为属性值使用。 **4. 模板列** - 在数据绑定控件中,模板列允许开发者通过...

    在ASP.NET 2.0中实现数据的绑定

    ASP.NET 2.0的数据绑定语法也得到了简化,DataBinder.Eval表达式变得更易于理解和使用,同时也支持双向数据绑定,允许在控件属性与数据源之间自动传递值。对于层次结构的XML数据,ASP.NET 2.0引入了基于XPath的数据...

    asp.net c# table 布局 datalistk绑定

    - 使用`("FieldName") %&gt;`表达式来显示数据字段的值,其中`FieldName`是数据源中的字段名。 例如,以下是一个简单的`DataList`模板,使用`Table`布局展示数据: ```html &lt;td&gt;&lt;%# Eval("ProductName") %&gt; ...

    第七章 asp.net数据绑定控件(一)事例

    在ASP.NET中,数据绑定控件是Web开发中不可或缺的一部分,它们使得开发者能够方便地将数据库或其他数据源中的数据展示到网页上。本章节主要探讨的是数据绑定控件的使用,我们将围绕这一主题展开深入讨论。 首先,...

    ASP.NET 2.0快速入门(7):ASP.NET 2.0 数据绑定的基本技巧

    ASP.NET 2.0支持一种特殊的语法,称为数据绑定表达式,如`("FieldName") %&gt;`,它可以用来从数据源中获取值并显示在页面上。 7. **数据操作** GridView不仅支持显示数据,还允许用户编辑、插入和删除数据。只需...

    asp.net数据绑定

    ASP.NET 数据绑定是微软开发的一种强大的技术,用于在Web应用程序中动态显示和操作数据。它允许开发者将数据源(如数据库、XML文件或对象集合)与用户界面元素(如控件)连接起来,使得数据的更新和展示变得更加简单...

    ASP.NET下使用RDLC操作报表

    通过学习这些文档,你不仅可以了解如何在ASP.NET环境中使用RDLC报表,还能掌握如何与各种数据源交互,以及如何创建动态、交互式的报表来满足业务需求。理解并熟练运用这些知识,对于开发出具有强大数据展示能力的Web...

    ASP.NET 2.0快速入门(9):ASP.NET 2.0 数据绑定高级技巧

    3. **DataBinding Expressions**(数据绑定表达式):数据绑定表达式支持更复杂的逻辑,如条件判断、计算和调用方法。例如,`("ID") %&gt;' /&gt;` 这行代码会根据数据源中的ID生成链接。 4. **ObjectDataSource**:...

    ASP.NET 2.0快速入门(2):ASP.NET 2.0 数据绑定

    4. **绑定表达式**:在ASP.NET 2.0中,我们可以使用`&lt;%# %&gt;`绑定表达式来将控件属性与数据源字段关联。例如,`("ColumnName") %&gt;'&gt;`会将"ColumnName"字段的值显示在Label控件上。 5. **数据绑定事件**:控件如...

    asp.net 在DED中使用参数源码

    3. **数据绑定表达式**:ASP.NET允许在控件的属性中使用数据绑定表达式,如 `&lt;%# %&gt;`,这使得可以在运行时动态地设置参数值。 4. **代码隐藏层**:在VB.NET的CodeBehind文件中,可以创建方法来处理参数,例如在Page...

    将单值绑定到Web服务器控件的属性

    在ASP.NET Web应用程序开发中,将单值绑定到Web服务器控件的属性是常见的操作,它使得动态数据处理变得简单而高效。这种技术允许我们直接将数据库或其他数据源中的值映射到页面上的控件,如Label、TextBox、...

    ASO.NET前台页面绑定数据大全

    **Eval()** 和 **DataBinder.Eval()** 是两种常用的数据绑定表达式,用于在ASP.NET中获取数据项的值。它们的主要区别在于,DataBinder.Eval() 提供了更多的灵活性和安全性。 1. **Eval()** 的基本用法: ```html ...

Global site tag (gtag.js) - Google Analytics