`
阅读更多
题记:
    做BS架构的应用系统,最让人不满的操作方便性上始终无法和CS的应用媲美。希望不断的改进BS系统的易用性是大家共同的心愿。
    在BS系统上,业务数据的编辑方式,最常见的是逐条用表单编辑提交。用户常常说,为啥不象Excel一样可以批量操作?于是在DataGrid/GridView控件中使用模板列,每个格子里放一个文本框。让用户直接录入,批量提交。
    用户又说了,有些信息我几乎所有的人都差不多,一个个的填麻烦啊,能不能改进下?
我说:能!于是有了这篇博文,呵呵,供大家参考。

思路:
大家还记得IE浏览器中如何设置代理服务器的吧?呵呵。见下图


看,如果填写的内容差不多,可以只录入一次的,呵呵。因此我就设想了如下的使用场景:


大家,看——如果标题行的复选框没选中,那么,整列的内容都随着第一行的内容变化!不选中的列,则不受影响
除此之外,我还实现了以下功能:
特点:第一行的内容变化,其他行虽然变化,但用户依然可以对个别数据进行调整,可以大同小异,差异化操作。呵呵
特点:标题行的复选框选中后,然后如果再取消选择,其他文本框的内容可以复原。也就是记住开始的数值,撤消一致。
特点:可以不局限于文本框,各种控件都可以。自定义和用户控件可能要相应修改少量脚本。这里的示例使用了日期控件。
特点:IE6、IE7、Firefox下测试都通过。


我下面给出示例性代码,供大家参考。难度很小,大家一看就懂。大家照着思路和提示,相信很快可以完成自己批量操作功能。呵呵
javascript:脚本是关键啊
    <script type="text/javascript" language="javascript">
    TS_Util
=new Object();
    TS_Util.Arrs 
= new Array;
    TS_Util.AllSameCheck
=function(obj,no)
    
{
        
var theTable  = obj.parentNode.parentNode.parentNode; 
        
var j = obj.parentNode.cellIndex; 
        
        TS_Util.ArrayManage(no,theTable.rows.length);
        
        
for(var i=0;i<theTable.rows.length;i++
        
{
            
var objTextBox;
            
if (navigator.userAgent.indexOf('MSIE'> -1)
            
{
                objTextBox 
= theTable.rows[i].cells[j].childNodes[0];
                
if(i > 1 && no == 2)
                
{
                    theTable.rows[i].cells[j].childNodes[
2].disabled = obj.checked; 
                }

            }

            
else
            
{
                objTextBox 
= theTable.rows[i].cells[j].childNodes[1]; 
            }

            
if(obj.checked)   
            TS_Util.Arrs[no 
* theTable.rows.length + i] = objTextBox.value;
            
if(i > 1)
            
{
            
//    objTextBox.disabled = obj.checked; 
                if(obj.checked)
                    objTextBox.value 
= TS_Util.Arrs[no * theTable.rows.length + 1];
                
else
                    objTextBox.value 
= TS_Util.Arrs[no * theTable.rows.length + i];
            }

        }
 
    }

    TS_Util.ArrayManage
=function(no, MaxLength)
    
{
        
if(TS_Util.Arrs.length <= no * MaxLength)
        
{
            
var startpos = TS_Util.Arrs.length;
            
for(var i=startpos;i<(no+1* MaxLength;i++)
                TS_Util.Arrs.push(
'');
        }

    }

    TS_Util.AllSameValue
=function(obj)
    
{
        
var theTable  = obj.parentNode.parentNode.parentNode; 
        
var j = obj.parentNode.cellIndex; 
        
var objCheckBox = theTable.rows[0].cells[j].childNodes[1];
        
for(var i=2;i<theTable.rows.length;i++
        
{
            
var objTextBox;
            
if (navigator.userAgent.indexOf('MSIE'> -1)
                objTextBox 
= theTable.rows[i].cells[j].childNodes[0]; 
            
else
                objTextBox 
= theTable.rows[i].cells[j].childNodes[1]; 

            
if(objCheckBox.checked)
                objTextBox.value 
= obj.value;
        }
 
    }

    
</script> 

aspx页面的片段,datagrid中的一个模板列
                <asp:TemplateColumn HeaderText="DIC_NAME" SortExpression="DIC_NAME">
                    
<HeaderTemplate>
                        字典项(
<asp:CheckBox ID="CheckBox1" runat="server" Text="所有行相同"/>)
                    
</HeaderTemplate>
                    
<ItemTemplate>
                        
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("DIC_NAME") %>'></asp:TextBox>
                    
</ItemTemplate>
                
</asp:TemplateColumn>

注意 表头的控件:CheckBox1  编辑的文本框:TextBox1
C#代码把脚本和html上的服务器控件关联起来:
    protected void GridView1_RowDataBound(object sender, DataGridItemEventArgs e)
    
{
        
if (e.Item.ItemType == ListItemType.Header)
        
{
            CheckBox CheckBox1 
= (CheckBox)e.Item.FindControl("CheckBox1");
            CheckBox1.Attributes.Add(
"OnClick""TS_Util.AllSameCheck(this,0);");
        }

        
else if (e.Item.ItemType == ListItemType.Item && e.Item.ItemIndex == 0)
        
{
            TextBox TextBox1 
= (TextBox)e.Item.FindControl("TextBox1");
            TextBox1.Attributes.Add(
"onkeyup""TS_Util.AllSameValue(this);");
        }

    }

注意:CheckBox1.Attributes.Add("OnClick""TS_Util.AllSameCheck(this,0);");
如果想象前面的截图那样有多个列需要类似的功能,则为TS_Util.AllSameCheck(this,1);") 这个数字是从0开始,递增的,不能跳数。

其它值得注意的地方,如果您使用的不是文本框,比如象我一样使用一个日期控件,您可能不能使用Onkeyup事件。必须额外在对第一行数据中相应的控件中使用
TextBox3.Attributes.Add("onpropertychange", "TS_Util.AllSameValue(this);");
对,就是要 onpropertychange 这个事件,呵呵

还有前面给出的脚本代码中注意这句
if(i > 1 && no == 2)
{
    theTable.rows[i].cells[j].childNodes[2].disabled = obj.checked;
}
这个也是为了日期控件特意加的代码。因为就算你把日期的文本框设置成不能用的,但右边的图片还是可以点,可以弹出日期选择的。因此加了一句。不过大家每个公司使用的日期控件是五花八门的,或许有些人的控件就不需要这样处理。大家自己微调吧。

http://piedpiper.cnblogs.com
本文是偶原创,想转贴的朋友劳驾写明转贴二字。呵呵。如果大家使用中有什么疑问,欢迎一起交流。偶对javascript脚本没什么研究,估计写的比较烂,也请大家一起改进。改进后,请到这里教教偶,偶这算是抛砖引玉啦。
分享到:
评论

相关推荐

    命令行设置IE代理服务器设置,实现多机同时上网

    ### 命令行设置IE代理服务器以实现多机同时上网 #### 背景介绍 在局域网环境中,通常会有这样的需求:通过一台计算机(我们称为主机)作为代理服务器,帮助局域网内的其他计算机(客户端)访问互联网。这种场景下,...

    IE代理服务器设置被禁用问题

    IE代理服务器设置被禁用问题 收藏  有时管理员为了限制上网,将IE代理服务器设置禁用了,我们只要通过组策略将其启用即可。  单击“开始->运行”,输入“gpedit.msc”打开组策略:  对于IE5.0/6.0 ,依次...

    Delphi实现IE_代理服务器设置程序

    根据给定的信息,本文将详细解析如何使用 Delphi 实现 IE 代理服务器设置程序的关键技术点,包括 Delphi 的基本概念、与 IE 代理相关的 API 调用、注册表操作以及具体的代码实现。 ### 一、Delphi 基础 Delphi 是...

    java操作IE代理

    在Java编程中,有时我们需要模拟用户的网络环境,例如设置IE(Internet Explorer)浏览器的代理以进行自动化测试或者数据抓取。这个"java操作IE代理"的主题涉及到如何在Java程序中控制IE的网络代理设置,这通常需要...

    清除IE代理服务器设置

    使用网络不同,所以总要从新设置IE代理服务器,不用时再清除。每次都要在IE里点来点去的,非常麻烦。 &lt;br&gt;于是萌发了想制作清除IE代理服务器设置的软件。算上上网查资料的时间,共用了3、4个小时,小软件诞生了。...

    VB设置IE代理服务器

    在VB(Visual Basic)编程中,有时候我们需要对Internet Explorer(IE)浏览器的代理服务器进行设置,以便通过特定的代理服务器访问网络。这个过程涉及到Windows API(应用程序接口)的调用和注册表的操作。下面我们...

    用VB来实现快速修改IE代理服务器的源码

    VB 修改 代理 服务器地址 端口 IE 用VB来实现代理服务器的源码 ...快速设置或修改IE代理服务器地址和端口 设置代理服务器、修改代理服务器 在windows 7和vb 5.0上运行通过,里面含有编译后的exe运行程序

    C#设置IE代理和使用代理访问网页

    以上步骤实现了对系统IE代理的配置,但需要注意的是,这种方法直接修改了系统的注册表设置,因此可能会导致全局代理的变化,适用于需要全局应用代理的情况。 ### 使用代理访问网页 #### 创建WebProxy对象 为了...

    设置IE浏览器代理服务器

    Edit:hua.peng Date:2015/11/19 1.用于开启和设置IE浏览器中的局域网(LAN)代理服务器。

    设置IE代理服务器1.0.rar

    设置IE代理服务器1.0.rar 设置IE代理服务器1.0.rar 设置IE代理服务器1.0.rar 设置IE代理服务器1.0.rar 设置IE代理服务器1.0.rar 设置IE代理服务器1.0.rar

    易语言设置IE代理

    在“易语言设置IE代理”这个主题中,我们主要关注的是如何使用易语言来操作Internet Explorer(IE)浏览器的网络代理设置。 在互联网访问中,代理服务器起到一个中介的作用,它接收用户的请求并转发给目标服务器,...

    清空ie代理设置,清除代理配置,重置系统代理

    退出一些代理软件的时候,如果没有正常清空ie代理设置,就会导致浏览器上不了网,使用这个小工具,就可以解决这个问题。

    几个快速设置ie代理的小软件

    标题中的“几个快速设置ie代理的小软件”表明这个压缩包可能包含了一些小巧的工具,用于便捷地配置Internet Explorer(IE)浏览器的代理设置。在Windows操作系统中,IE是默认的网页浏览器,用户有时需要通过代理...

    IE代理服务器设置可用.pdf

    **IE代理服务器设置详解** ...总之,正确设置IE的代理服务器是实现网络访问控制和提升网络安全的重要手段,但同时也需要根据实际情况和需求谨慎操作。理解并掌握这些设置,能帮助用户更好地管理和使用自己的网络环境。

    socket实现HTTP代理服务器

    ### Socket 实现 HTTP 代理服务器的关键知识点 #### 一、HTTP 代理服务器的基本概念与工作原理 HTTP 代理服务器是一种中介服务,它位于客户端(如浏览器)与目标服务器之间,帮助客户端发送请求到目标服务器,并将...

    易语言源码设置IE代理服务器1.0.7z

    在这个"易语言源码设置IE代理服务器1.0.7z"压缩包中,我们主要探讨的是如何使用易语言来编写程序,实现对Internet Explorer(IE)浏览器的代理服务器设置功能。 首先,让我们理解什么是代理服务器。代理服务器是...

    LR11使用代理录制--如无法使用IE浏览器录制,设置代理后可以使用谷歌,火狐录制

    此时,如果用户希望使用更现代化且兼容性更好的浏览器(如Chrome或Firefox)进行录制,则可以通过设置代理来实现这一目的。 #### 四、如何配置LR11使用代理录制? 1. **安装代理服务器**: - 如果还没有安装代理...

    IE设置代理

    IE设置代理服务器(127.0.0.1),关闭时取消代理

    设置IE代理的小程序,简单易操作

    标题中的“设置IE代理的小程序”指的是一个专为Internet Explorer(IE)浏览器设计的应用程序,它的主要功能是帮助用户快速、便捷地配置和管理代理设置。对于那些在工作和私人生活中需要频繁切换代理服务器的人来说...

Global site tag (gtag.js) - Google Analytics