使用Repeater实现类似GridView编辑功能

  Repeater控件他给了我们编程人员完好的可编辑性,而且执行效率是微软三个数据控件最快的 ,但是由于自身局限性(没有EditTemplate属性)还不能很好的实现类似于Gridview中的添加、修改、删除功能,但是是不是不能实现了呢,嘿嘿。
        要实现上面功能,首先有两个技术点要解决:
        1、
        2、

        第一个可以通过linkbutton的CommandName和CommandArgument两个属性进行设置,代码如下

< tr >
    
< td  style ="background-color: #FFF; height:25px; width:30%;" >
        
<% # DataBinder.Eval(Container.DataItem, "a") %>
    
</ td >
    
< td  style ="background-color: #FFF;  width:30%;" >
        
<% # DataBinder.Eval(Container.DataItem,"b" %>
    
</ td >
    
< td  style ="background-color: #FFF;  width:30%;" >
        
<% # DataBinder.Eval(Container.DataItem,"c" %>
    
</ td >
    
< td  style ="background-color: #FFF; width:10%;" >
        
< asp:LinkButton  runat ="server"  ID ="lbtEdit"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
            CommandName="Edit" Text="编辑">
</ asp:LinkButton > &nbsp;&nbsp;&nbsp;
        
< asp:LinkButton  runat ="server"  ID ="lbtDelete"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
            CommandName="Delete" Text="删除">
</ asp:LinkButton >
    
</ td >
</ tr >

       
        然后在后台设置RepeaterOnItemDataBound事件,通过

e.CommandName

        可以确定是什么操作。

        而关于第二点有有点二了,暂时没找到更好的解决方案。我是这样的,在ItemTemplate中加入两个Panel分别放正常和编辑状态显示的内容,如下

< ItemTemplate >
    
< asp:Panel  ID ="plItem"  runat ="server" >
        
< tr >
            
< td  style ="background-color: #FFF; height: 25px; width: 30%;" >
                
<% # DataBinder.Eval(Container.DataItem, "a") %>
            
</ td >
            
< td  style ="background-color: #FFF; width: 30%;" >
                
<% # DataBinder.Eval(Container.DataItem,"b" %>
            
</ td >
            
< td  style ="background-color: #FFF; width: 30%;" >
                
<% # DataBinder.Eval(Container.DataItem,"c" %>
            
</ td >
            
< td  style ="background-color: #FFF; width: 10%;" >
                
< asp:LinkButton  runat ="server"  ID ="lbtEdit"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
                    CommandName="Edit" Text="编辑">
</ asp:LinkButton > &nbsp;&nbsp;&nbsp;
                
< asp:LinkButton  runat ="server"  ID ="lbtDelete"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
                    CommandName="Delete" Text="删除">
</ asp:LinkButton >
            
</ td >
        
</ tr >
    
</ asp:Panel >
    
< asp:Panel  ID ="plEdit"  runat ="server" >
        
< tr >
            
< td  style ="background-color: #FFF; height: 25px; width: 30%;" >
                
< asp:TextBox  ID ="txtA"  Text ='<%#  DataBinder.Eval(Container.DataItem,"a") % > ' runat="server"> </ asp:TextBox >
            
</ td >
            
< td  style ="background-color: #FFF; width: 30%;" >
                
< asp:TextBox  ID ="txtB"  Text ='<%#  DataBinder.Eval(Container.DataItem,"b") % > ' runat="server"> </ asp:TextBox >
            
</ td >
            
< td  style ="background-color: #FFF; width: 30%;" >
                
< asp:TextBox  ID ="txtC"  Text ='<%#  DataBinder.Eval(Container.DataItem,"c") % > ' runat="server"> </ asp:TextBox >
            
</ td >
            
< td  style ="background-color: #FFF; width: 80px; width: 10%;" >
                
< asp:LinkButton  runat ="server"  ID ="lbtUpdate"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
                    CommandName="Update" Text="更新">
</ asp:LinkButton > &nbsp;&nbsp;&nbsp;
                
< asp:LinkButton  runat ="server"  ID ="lbtCancel"  CommandArgument ='<%#  DataBinder.Eval(Container.DataItem, "ID")% > '
                    CommandName="Cancel" Text="取消">
</ asp:LinkButton >
            
</ td >
        
</ tr >
    
</ asp:Panel >
</ ItemTemplate >


        这样有一个缺点,会在每行tr标签前后多出div标签,虽然这不影响显示(在IE和FF中测试过),但是这给页面造成了垃圾代码,希望那位知道其他解决方案告知下,我在这里就抛砖引玉了:)
        
        接着由后台判断,代码如下 

protected   void  Repeater1_ItemDataBound( object  sender, RepeaterItemEventArgs e)
{
    
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    
{
        
if (m_dt.Rows[e.Item.ItemIndex]["ID"].ToString() != m_iID.ToString())
        
{
            ((Panel)e.Item.FindControl(
"plItem")).Visible = true;
            ((Panel)e.Item.FindControl(
"plEdit")).Visible = false;
        }

        
else
        
{
            ((Panel)e.Item.FindControl(
"plItem")).Visible = false;
            ((Panel)e.Item.FindControl(
"plEdit")).Visible = true;
        }

    }

}


protected   void  Repeater1_ItemCommand( object  source, RepeaterCommandEventArgs e)
{
    
if (e.CommandName == "Edit")
    
{
        m_iID 
= int.Parse(e.CommandArgument.ToString());
    }

    
else if (e.CommandName == "Cancel")
    
{
        m_iID 
= -1;
    }

    
else if (e.CommandName == "Update")
    
{
        
//Update.

        
string sA = ((TextBox)this.Repeater1.Items[e.Item.ItemIndex].FindControl("txtA")).Text.Trim();
        
string sB = ((TextBox)this.Repeater1.Items[e.Item.ItemIndex].FindControl("txtB")).Text.Trim();
        
string sC = ((TextBox)this.Repeater1.Items[e.Item.ItemIndex].FindControl("txtC")).Text.Trim();

        
this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "key""alert('更新ID:" +
            e.CommandArgument 
+ ";页面值:A," + sA + "----B," + sB + "----C," + sC + "');"true);
    }

    
else if (e.CommandName == "Delete")
    
{
        
//Delete.            
        this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "key""alert('删除ID:" + e.CommandArgument + "');"true);
    }


    Repeater1.DataSource 
= this.InitDataTable();
    Repeater1.DataBind();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值