推荐.NET教程: ASP.NET C# 开发环境 Ajax教程 控件开发 统计报表 数据库 Web服务 安装部署 CommunityServer NHibernate DataGrid/GridView 实用代码 VS2005
示例源码 MVC/三层 SqlHelper 入门源码 开源 CMS Ajax/Atlas C#.net 毕业设计 源码 经典代码 商业 本站作品 持久层 随书源码 WebService 英文/汉化 Asp.net2.0

阿牛·乐园

每天进步一点点

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  80 随笔 :: 14 文章 :: 389 评论 :: 13 引用
  把数据绑定到控件,不知道大家用哪种方法?
  很早之前,我一般在aspx中放置控件,在后台的代码中用代码直接给相应的控件设置属性的值。这样的方法优点是灵活,可以依据业务逻辑,灵活的设置控件的Text以及Visible。示例如下:  
            <table>
                
<tr>
                    
<td>
                        用户名
                    
</td>
                    
<td>
                        
<asp:TextBox ID="tbName" runat="server" ></asp:TextBox>
                    
</td>
                
</tr>
            
</table>
然后后台里写代码:
    protected User OperData
    
{
        
get;
        
set;
    }


    
protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            
this.tbName.Text = OperData.Name;
        }

    }

  不久之前,我发现在写好多字段的如果都这样写的话,会很累的,虽然效率会很高。所以我尝试采用如下的方式:
  尽可以的避免在代码中直接写来给控件属性设置值,而通过前台的绑定来实现,如:
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%#OperData.Name %>'></asp:TextBox>
不过,这样的话,在后台也应该至少有一句绑定操作,像这样:
    protected void Page_Load(object sender, EventArgs e)
    
{
        
if (!Page.IsPostBack)
        
{
            
this.DataBind();
        }

    }

虽然绑定上了,但这里有一个问题,我们的页面上的控件,不是都是在 !Page.IsPostBack这个条件的时候要绑定,也许还要有别的要求。还有,既然已经Page.IsPostBack也是条件,我们要是不用在后台代码里写this.DataBind不是更好吗?
  其实,说难也不难,我们来实现一个控件,这个控件用来自动绑定,且分条件的绑定。下面看下代码:
namespace Iyond.Web.UI.WebControls
{
    
public class NullPanel : Panel
    
{
        
private bool _autoBind = true;

        
public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer)
        
{
            
//因为NULL吗,所以什么也不输出
            
//base.RenderBeginTag(writer);
        }


        
public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer)
        
{
            
//因为NULL吗,所以什么也不输出
            
//base.RenderEndTag(writer);
        }


        
protected override System.Web.UI.HtmlTextWriterTag TagKey
        
{
            
get
            
{
                
return System.Web.UI.HtmlTextWriterTag.Unknown;
            }

        }


        [DefaultValue(
true)]
        
public bool AutoBind
        
{
            
get
            
{
                
return _autoBind;
            }

            
set
            
{
                _autoBind 
= value;
            }

        }


        
protected override void OnLoad(EventArgs e)
        
{
            
base.OnLoad(e);
            
//重置显示属性,好引发 OnPreRender
            this.Visible = true;
        }


        
protected override void DataBindChildren()
        
{
            
//分条件绑定子控件,条件就是:
            if (this.Visible && this.AutoBind)
            
{
                
base.DataBindChildren();
            }

        }


        
protected override void OnPreRender(EventArgs e)
        
{
            
//在这里,我们要给数据绑定数据,不知道这个位置是不是最好
            if (this.AutoBind)
            
{
                
this.DataBind();
            }


            
base.OnPreRender(e);
        }

    }

}

  有了上面这个控件,我现在可以像下面一样写代码:
<asp:NullPanel ID="panelFenInfo" runat="server" 
        Visible
='<%#this.IsEditMode%>' >
  
<asp:TextBox ID="tbName" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
<asp:NullPanel ID="panelInfo" runat="server" 
        Visible
='<%#!Page.IsPostBack%>' >
  
<asp:TextBox ID="tbCompany" runat="server" Text='<%#this.OperData.Name %>'></asp:TextBox>
<asp:NullPanel>
后台代码,这时就不用写了。
  写到这里,不知道大家看明白没有,我的文笔可真差,希望大家多在评论中指出。
posted on 2007-04-09 16:28 阿牛 阅读(2448) 评论(6)  编辑 收藏 网摘 所属分类: ASP.netC#

评论

#1楼  2007-04-09 16:39 随心所欲      
多写一点绑定逻辑,好像又回到了asp时代了。
  回复  引用  查看    

#2楼 [楼主] 2007-04-09 16:50 阿牛      
@随心所欲
是呀。不过,现在都是CSS定位了。这个东西,有一个好处,就是可以用CodeSmith生气
  回复  引用  查看    

#3楼  2007-04-09 19:38 rhs [未注册用户]
我觉得这样写法不如直接赋值,这样做到一目了解。
我觉得msdn上有一篇文章写得不错,也是绑定数据的。
  回复  引用    

#4楼 [楼主] 2007-04-09 20:38 阿牛      
@rhs
那篇,帮忙提供下网址,我看下,谢谢了
  回复  引用  查看    

#5楼  2007-04-10 15:26 3Q [未注册用户]
唉~~~~~~~~~~~~~~
楼主……
您换ASP.NET2.0吧
  回复  引用    

#6楼  2008-09-30 13:28 DavyJ      
你这样做很麻烦的,参考这个文章,利用发射绑定数据
http://www.cnblogs.com/victor136/articles/47376.html
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-09 16:30 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: