您的位置:首页 > 数据库

Ajax实现将可以编辑的表格与数据库交互

2012-12-28 17:16 225 查看
上篇博客通过JQuery实现单击表格进行编辑的功能,本篇博客将继续延伸,将在此功能的基础之上,与数据库交互,实现真正的可编辑。



传统的网页,如果需要更新数据,需要更新整个页面,而Ajax可以通过在后台与服务器进行少量数据交换,使网页实现异步更新,是一种在无需加载整个网页的情况下, 能够更新部分网页的技术。

本篇博客将上传我在项目用到的可以编辑的表格的源代码。继续丰富了上篇博客中的编辑效果,又与数据库进行交互,实现真正的可编辑。

Html页面的代码:

<div class="span9">
       <%-- 显示提示信息--%>
        <asp:Label ID="Label1" runat="server" Text="说明 :单击模块名称进行修改,回车或单击其它地方确定修改,ESC取消编辑。" ForeColor="Red"></asp:Label>
     <%--   局部更新--%>
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <%-- 表格 --%>
                <table class="table table-striped">
                    <tr>
                        <th>模块ID</th>
                        <th>模块名称</th>
                        <th>删除</th>
                    </tr>
                    <%--绑定到Repeater--%>
                    <asp:Repeater ID="rptModel" runat="server">
                        <ItemTemplate>
                            <tr>
                                <td><%#Eval("mdlID")%></td>
                                <td class="modelname"><%#Eval("mdlName")%></td>
                                <td>
                                    <asp:LinkButton ID="lbtnDelete" runat="server" OnClick="lbtnDelete_Click" OnClientClick="return confirm('是否要真的删除?')" CommandArgument='<%#Eval("mdlID") %>'>删除</asp:LinkButton>
                                </td>
                            </tr>
                        </ItemTemplate>
                    </asp:Repeater>
                </table>
            </ContentTemplate>
        </asp:UpdatePanel>
        <%--显示错误信息--%>
        <div id="test"></div>
        <%--添加模块名称--%>
        <p>
            <asp:Label ID="Label2" runat="server" Text="模块名称"></asp:Label>
            <asp:TextBox ID="txtModelName" runat="server"></asp:TextBox>
            <asp:Button ID="btnAddModel" UseSubmitBehavior="false" runat="server" Text="添加" CssClass="btn btn-info" OnClick="btnAddModel_Click" />
        </p>
    </div>


绑定信息代码:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                //绑定模块信息
                ModelInfoMgr modelInfoMgr = new ModelInfoMgr();
                DataTable dt = new DataTable();
                //查询所有的模块信息
                dt = modelInfoMgr.SelectAll();
                //绑定
                rptModel.DataSource = dt;
                rptModel.DataBind();

            }
        }


重头戏来了,JS代码

$(function () {
    $(".modelname").click(function () {//给页面中的modelname的标签加上click事件
        var objTD = $(this);
        //alert("heheh");
        //点击后,内容变成文本框
        var oldText = $(this).text();  //保存原来的文本
        var input =$( "<input type='text'  value='" + oldText + "'/>");//文本框的html代码
        objTD.html(input);  //td变为文本
        //设置文本框的点击事件失效
        input.click(function () {
            return false;
        });
        //设置文本框的样式
        input.css("border-width", 0);  //边框为0
        input.css("margin", 0);
        input.css("padding", 0);
        input.css("color","black");
        //input.height(objTD.height);//文本框的高度为当前td的高度
        //input.width(objTD.width);
        input.trigger("focus").trigger("select");//全选
        //文本框失去焦点的时候变为文本
        input.blur(function () {
            var newText = $(this).val();
            var input_blur = $(this);
            //objTD.html(newText);
            //当原来的名称与修改后的名称不同时才进行数据库提交操作
            if (oldText != newText) {

                //获取该模块名称对应的ID
                var modelID = $.trim(objTD.prev().text());
                // AJAX异步更改数据库
                var url = "../handler/changeModelName.ashx?modelname=" + encodeURI(encodeURI(newText)) + "&modelID=" + modelID + "&t=" + new Date();
                $.get(url, function (data) {
                    if (data == "false") {
                        $("#test").text("模块名称修改失败,请检查是否重复");
                        input_blur.trigger("focus").trigger("select");  //文本框全选
                    }
                    else {
                        $("#test").text("");
                        objTD.html(newText);
                    }
                });
            }
            else {
                //前后文本一样,将文本宽变成标签
                objTD.html(newText);
            }
        });
        //在文本框中按下键盘某建
        input.keydown(function () {
            var jianzhi = event.keyCode;
            var input_keydown = $(this);
            switch (jianzhi) {
                case 13:   //按下回车,保存修改
                    var newText = input_keydown.val();//修改后的名称
                    //当原来的名称与修改后的名称不同时才进行数据库提交操作
                    if (oldText != newText) {
                        //获取该模块名称对应的ID
                        var modelID = $.trim(objTD.prev().text());
                        // AJAX异步更改数据库
                        var url = "../handler/changeModelName.ashx?modelname=" + encodeURI(encodeURI(newText)) + "&modelID=" + modelID + "&t=" + new Date();
                        $.get(url, function (data) {
                            if (data == "false") {
                                $("#test").text("模块名称修改失败,请检查是否重复");
                                input_keydown.trigger("focus").trigger("select");  //文本框全选
                            }
                            else {
                                $("#test").text("");
                                objTD.html(newText);
                              
                            }
                        });
                    }
                    else {
                        //前后文本一样,将文本宽变成标签
                        objTD.html(newText);
                    }
                    break;
                case 27:    //按下Esc,取消修改,吧文本框变成文本
                    $("#test").text("");
                    objTD.html(oldText);
                    break;
            }
        });
    });
   
});
//屏蔽Enter按键
$(document).keydown(function (event) {
    switch (event.keyCode) {
        case 13: return false;
    }
});



handler文件:



public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string modelid= context.Request.QueryString["modelID"];
            string modelname=context.Server.UrlDecode(context.Request.QueryString["modelname"]);
            //更改模块名称
            ModelInfoMgr modelInfoMgr = new ModelInfoMgr();
            ModelInfo modelInfo = new ModelInfo();
            modelInfo.ID = modelid;
            modelInfo.Name = modelname;
            //判断是否已经存在
            if (modelInfoMgr .Exists(modelInfo))
            {
                context.Response.Write("false");
                return;
            }
          bool flag=  modelInfoMgr.Update(modelInfo);
          if (flag)
          {
              context.Response.Write("true");
          }
          else
          {
              context.Response.Write("false");
          }
        }




效果图:



如图中的提示,上面的代码做单击 模块名称就可以进行修改,且回车或者单击其他地方确定修改,按ESC取消编辑。

这是在牛腩老师的方法,希望在以后的学习中,可以领会此方法之外,能够更新知识和做法,也希望得到大牛的指导和点拨,再次感谢了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: