posts - 22, comments - 18, trackbacks - 0, articles - 81

2012年1月12日

本次课程讲的是对Asp.Net Ajax的全球化和本地化的开发。

首先说明了全球化和本地化的定义。

  • 全球化是一个面向多种文化开发和设计一个应用程序的过程。
  • 本地化是面向特定文化和地区定制应用程序的过程

全球化:面向多种文化,设计
本地化:面向特定文化,定制
结论:
- 全球化为应用程序提供多文化的支持
- 本地化"全球化"带来的支持进行定制
- 两者密不可分

在Asp.Net中使用全球化

  1. 首先在网站中创建App_GlobalResources文件夹,然后添加全球化资源文件GlobalResource.resx。在创建了基本的GlobalResource.resx文件之后,可以根据多语言创建对应的资源文件,如:要创建美国使用的资源可以创建GlobalResource.en-US.resx资源文件。注意en-US是标准的表示国家的编码。
  2. 在两个资源文件中创建相同名字的键,然后根据国家范围,指定相同名字的键的键值。如添加TodayIs的键,在GlobalResource.resx的键值为"今天是",在GlobalResource.en-US.resx的键值是"Today is"。
  3. 现在可以在对一个控件的值根据资源文件来赋值了,如创建一个lable,那么可以设置这个label的Text的值为Resources.GlobalResource.TodayIs。这样Web应用程序会根据当前客户发送过来的国家编码自动加载TodayIs的值。
  4. 如果手动改变Culture。我们可以在页面中重写InitializeCulture方法。在重写方法中我们可以通过以下代码来改变当前请求的文化值。
    this.Page.UICulture = "en-us";
    this.Page.Culture = "en-us";
    注意根据Culture得到相对应的资源文件是由UICulture影响的,Culture只是影响文本显示的格式。在指定完Culture以后,一定要调用基类的InitializeCulture方法。除了通过手工代码指定外,还可以在页面上指定UICulture和Culture的值,并且也可以在web.Config文件里System.Web节点下添加
    <globalization culture="auto" uiCulture="auto" />
    节点。culture和uiCulture指定为auto表明根据客户端发送过来的国家信息,来使用相应的资源文件和对应的格式。UICulture和Culture都有两种设置方式,使用其中一种就可以了
    this.Page.UICulture
    Thread.CurrentThread.CurrentUICulture 
    this.Page.Culture 
    Thread.CurrentThread.CurrentCulture 
  5. 除了在页面可以使用资源文件给控件赋值,还可以在页面上赋值。
    <asp:Label runat="server" Text="<%$ Resources:GlobalResource, TodayIs %>" /><%= DateTime.Now.ToString("D"%>
    这是使用ASP.NET 表达式给lable的Text属性赋值。

使用Asp.Net的本地化。

  1. 首先创建App_LocalResources文件夹,在文件夹下创建与页面名相同的资源文件。假设页面名为Default,那么本地化资源名叫Default.aspx.resx和Default.aspx.en-US.resx。并在资源文件中创建lblCurrentTime.Text键,并指定相应的值为"今天是"和"Today is "。
  2. 那么我们可以直接在页面上使用如下标记
    <asp:Label runat="server" meta:resourcekey="lblCurrentTime" /><%= DateTime.Now.ToString("D"%>
    使用了这种标记之后,页面会根据当前的Culture知道对应的本地化资源文件名,然后根据指定的resoucekey和指定的lblCurrentTime的键,得到相应的值。

在Asp.Net Ajax中使用全球化功能。

ASP.NET AJAX的全球化功能仅涉及到对象字符串的转换格式不涉及Global资源文件,仅取决于Culture,与UICulture无关

  1. 首先要把全球化功能打开
    <asp:ScriptManager runat="server" ID="sm" EnableScriptGlobalization="true" /> 
  2. 那么我们在使用相应的文本和对象的时候需要我们使用localeFormat进行转换为相应的国家显示的格式标准。

在Asp.Net Ajax中使用本地化功能。

脚本名称加上Culture名即可,基于字符串拼接,仅由UICulture决定。意思就是说,Asp.Net Ajax的本地化功能是通过js脚本文件来实现的,基于另外一个国家或地区的脚本文件只需要讲脚本文件的后缀加上国家或地区的编码即可。如:DemoResource.js和DemoResource.en-US.js文件。在js脚本文件中是利用命名空间和类来实现资源文件的功能。

Type.registerNamespace("Demo");

Demo.Resx 
=
{
"TodayIs" : "今天是"
}


那么在DemoResource.en-US.js文件里相应的就是

Type.registerNamespace("Demo");

Demo.Resx 
=
{
"TodayIs" : "Today is "
}

1.首先在ScriptManager中打开本地化功能。并且指定资源文件的路径

<asp:ScriptManager runat="server" ID="sm" EnableScriptLocalization="true">
<Scripts>
        
<asp:ScriptReference Path="~/Scripts/DemoResource.js"
            ResourceUICultures
="en-US" />
</Scripts>
</asp:ScriptManager> 

2.然后我们可以之间使用资源文件中的类和常量

 <script language="javascript" type="text/javascript">
    document.write(Demo.Resx.TodayIs 
+ new Date().localeFormat("yyyy/MM/dd"));
</script>

这样我们就可以根据客户端发送过来的国家和地区自动对应相应的资源文件

posted @ 2012-01-12 19:26 Lerry.Zhao 阅读(126) 评论(0) 编辑

2012年1月6日

第一种,把Array数组绑到dropdownlist
 程序代码
        string[] Month =new string[7]{ "January", "February", "March", "April", "May", "June", "July" };
        this.DropDownList1.DataSource = Month;
        this.DropDownList1.DataBind();

第一种方法只可以绑定一组数据到dropdownlist,因为drawdonwlist可以绑定两种数据1是DataTextField
2 是DataValueField 所以第一种方法绑定后DataTextField的值==DataTextField值
第二种,把Array数组绑定到dropdownlist
程序代码
ArrayList ar = new ArrayList();
        for (int i = 1; i <=12; i++)
        {
            ar.Add(i+"月");

        }
        this.DropDownList2.DataSource = ar;
        this.DropDownList2.DataBind();
 
直观一点的写法。
程序代码
ArrayList ar = new ArrayList();
                    ar.Add("1月");
                    ar.Add("2月");
                    ar.Add("3月");
                    ar.Add("4月");
..................................................

              this.DropDownList2.DataSource = ar;
        this.DropDownList2.DataBind();
第2种方法的好处是通过ArrayList.Add的方法,可以实现动态添加元素的功能,比方说,有一个DataTable,我们要把DataTable中一行的数据读出来添加到Arraylist当中。
程序代码
ArrayList ar = new ArrayList();
 DataTable dt=dataset.Tables[0]
foreach (DataRow dr in dt.Rows)
{ar.Add(dr[0].ToString()); }
以上代码从一个DataTable中通过foreach语句循环读取Table中一行数据中第一个格的值添加到ArrayList当中。
 
第三种方法,将Hashtable绑定到Dropdownlist当中Hashtable的方法的好处是,它也可以绑定两种数据一个是"key,一个是"value",这样的话,我们就可以为dropdonwlist绑定上两种不同的数据了。
程序代码
Hashtable Ht = new Hashtable();
        Ht.Add("January", "1月");
        Ht.Add("February", "2月");
        Ht.Add("March", "3月");
        Ht.Add("April", "4月");
        Ht.Add("May", "5月");
        Ht.Add("June", "6月");
        Ht.Add("July", "7月");
        this.DropDownList3.DataSource = Ht;
        this.DropDownList3.DataValueField = "key";
        this.DropDownList3.DataTextField = "value";
        this.DropDownList3.DataBind();
4种,把Object对象绑定到dropdownlist
首先新增一个类,结构如下
程序代码
public class ClassMonth
{
    private string _MonthEN = DateTime.Now.ToString("MMMM",System.Globalization.CultureInfo.CreateSpecificCulture("en"));
    private string _MonthCN = DateTime.Now.ToString("MMMM", System.Globalization.CultureInfo.CreateSpecificCulture("zh-CN"));
    public ClassMonth()
    {MonthCN = DateTime.Now.ToString("MMMM", System.Globalization.CultureInfo.CreateSpecificCulture("zh-CN"));
  MonthEN = DateTime.Now.ToString("MMMM", System.Globalization.CultureInfo.CreateSpecificCulture("en"));
    }
    public ClassMonth(string cn,string en)
    {
        MonthCN = cn;//导入变量为属性赋值
        MonthEN = en;//导入变量为属性赋值
    }
    public string MonthEN //构造属性
    {
       get{
            return _MonthEN;
        }
        set
        {
            _MonthEN = value;
        }
    }
    public string MonthCN  //构造属性
    {
        get {
            return _MonthCN;
        }
        set
          _MonthCN = value;
        }
    }
}
绑定方法
程序代码
ArrayList arlist=new ArrayList();
         arlist.Add(new ClassMonth("1月", "January"));
         arlist.Add(new ClassMonth("2月", "February"));
         arlist.Add(new ClassMonth("3月", "March"));
         arlist.Add(new ClassMonth("4月", "April"));
         arlist.Add(new ClassMonth("5月", "May"));

         this.DropDownList4.DataSource = arlist;
         this.DropDownList4.DataValueField = "MonthEN";
         this.DropDownList4.DataTextField = "MonthCN";
         this.DropDownList4.DataBind();

posted @ 2012-01-06 15:10 Lerry.Zhao 阅读(240) 评论(3) 编辑

2011年12月21日

开发过程中遇到了GridView 激发了未处理的事件“RowEditing”这样的一个错误,

但是可以确定的是我没有在GridView中使用RowEditing方法,可是为什么回报这错误呢?

通过在网上搜索,发现如果在

<asp:ButtonField ShowHeader="true" CommandName="edit" ButtonType="Link" HeaderText="修改"
                        HeaderStyle-Width="5%" DataTextFormatString="select{0}" Text="修改" ItemStyle-HorizontalAlign="Center" />中CommandName的值是“edit”的话就会报错这样的错误。

随后修改edit换成其他的名字就不再报错了。


posted @ 2011-12-21 09:20 Lerry.Zhao 阅读(133) 评论(0) 编辑

我们在用vs2005做数据绑定的时候运行出来的

回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。



 

有人说改成pages enableEventValidation="false",但这样我们绑定的控件就用不了了。
我在网上查了一下,只要我们把绑定代码写在IsPostBack里就好了。
因为如果不家判断,我们在点击绑定控件时数据绑定会重做,这样我们原来绑定的东西就不存在了,在回调时就会出错.

posted @ 2011-12-21 09:05 Lerry.Zhao 阅读(80) 评论(0) 编辑

2011年12月15日

网上有很多控制TreeView的checkbox选中,但是自己尝试的时候,要么报错,要么不可行。以下这种写法是经过验证有效的,仅作参考,思维比较巧妙!

Tree:

<asp:TreeView ID="treeViewDapartment" runat="server" SelectedNodeStyle-BackColor="GrayText" onclick="javascript:NodeCheck();" 
         Font-Size="13px"  ShowCheckBoxes="All" ShowLines="true" AutoGenerateDataBindings="false" ShowExpandCollapse="true" >
</asp:TreeView>

脚本:

<script language="javascript" type="text/javascript">
      //节点父节点选中子节点全选
      function NodeCheck() {  
            var o = window.event.srcElement;
            if (o.tagName == "INPUT" && o.type == "checkbox") //点击treeview的checkbox是触发 
            {
                var d = o.id; //获得当前checkbox的id; 
                var e = d.replace("CheckBox", "Nodes"); //通过查看脚本信息,获得包含所有子节点div的id 
                var div = window.document.getElementById(e); //获得div对象 
                if (div != null)  //如果不为空则表示,存在自节点 
                {
                    var check = div.getElementsByTagName("INPUT"); //获得div中所有的已input开始的标记 
                    for (i = 0; i < check.length; i++) {
                        if (check[i].type == "checkbox") //如果是checkbox 
                        {
                            check[i].checked = o.checked; //字节点的状态和父节点的状态相同,即达到全选 
                        }
                    }
                }
                else  //点子节点的时候,使父节点的状态改变,即不为全选
                {
                    var divid = o.parentElement.parentElement.parentElement.parentElement.parentElement; //子节点所在的div     
                    var id = divid.id.replace("Nodes", "CheckBox"); //获得根节点的id 

                    var checkbox = divid.getElementsByTagName("INPUT"); //获取所有子节点数
                    var s = 0;
                    for (i = 0; i < checkbox.length; i++) {
                        if (checkbox[i].checked)  //判断有多少子节点被选中 
                        {
                            s++;
                        }
                    }
                    if (s == checkbox.length)  //如果全部选中 或者 选择的是另外一个根节点的子节点 , 
                    {                               //    则开始的根节点的状态仍然为选中状态 
                        window.document.getElementById(id).checked = true;
                    }
                    else {                               //否则为没选中状态 
                        window.document.getElementById(id).checked = false;
                    }
                }

            }
    }
</script>

这个脚本的写法巧妙运用生成的页面源文件中checkbox与其子结点div之间的关系!

那么,只需要在注册一下触发事件即可:

protected void Page_Load(object sender, EventArgs e)
{  
        this.treeViewDapartment.Attributes.Add("onclick", "NodeCheck();");  

}

特别感谢,雷云锋给予的指导!

posted @ 2011-12-15 18:56 Lerry.Zhao 阅读(76) 评论(0) 编辑

2011年11月10日

//遍历option和添加、移除option
function changeShipMethod(shipping){
 var len = $("select[@name=ISHIPTYPE] option").length
 if(shipping.value != "CA"){
  $("select[@name=ISHIPTYPE] option").each(function(){
   if($(this).val() == 111){
    $(this).remove();
   }
  });
 }else{
  $("<option value='111'>UPS Ground</option>").appendTo($("select[@name=ISHIPTYPE]"));
 }
}


//取得下拉选单的选取值

$(#testSelect option:selected').text();
或$("#testSelect").find('option:selected').text();
或$("#testSelect").val();
//////////////////////////////////////////////////////////////////
记性不好的可以收藏下:
1,下拉框:

var cc1   = $(".formc select[@name='country'] option[@selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc select[@name="country"]').val();   //得到下拉菜单的选中项的值
var cc3 = $('.formc select[@name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值
$("#select").empty();//清空下拉框//$("#select").html('');
$("<option value='1'>1111</option>").appendTo("#select")//添加下拉框的option

稍微解释一下:
1.select[@name='country'] option[@selected] 表示具有name 属性,
并且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素;
可以看出有@开头的就表示后面跟的是属性。

2,单选框:
$("input[@type=radio][@checked]").val();   //得到单选框的选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked'); //设置单选框value=2的为选中状态.(注意中间没有空格)

3,复选框:
$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function(){ //由于复选框一般选中的是多个,所以可以循环输出
   alert($(this).val());
   });

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾


当然jquery的选择器是强大的. 还有很多方法.

<script src="jquery-1.2.1.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(document).ready(function(){
$("#selectTest").change(function()
{
       //alert("Hello");
       //alert($("#selectTest").attr("name"));
       //$("a").attr("href","xx.html");
       //window.location.href="xx.html";
       //alert($("#selectTest").val());
       alert($("#selectTest option[@selected]").text());
       $("#selectTest").attr("value", "2");

});
});
</script>


<a href="#">aaass</a>

<!--下拉框-->
<select id="selectTest" name="selectTest">
<option value="1">11</option>
<option value="2">22</option>
<option value="3">33</option>
<option value="4">44</option>
<option value="5">55</option>
<option value="6">66</option>
</select>
jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
                $("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
                $("#chk2").attr("checked",true);//打勾
                if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
            $("<optionvalue='1'>1111</option><optionvalue='2'> 2222</option>").appendTo("#sel")//添加下拉框的option
            $("#sel").empty();//清空下拉框

获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框

posted @ 2011-11-10 08:56 Lerry.Zhao 阅读(215) 评论(1) 编辑

2011年11月3日

摘要: 今天新开的一个项目突然发现引用System.Runtime.Serialization.Json 提示 命名空间 不存在类型或命名空间名称 json明明前段时间刚开发的WCF是很正常的引用的,认真比照了引用的文件位置是一样的,记得前段时间在CSDN上也有人抱怨看不到System.Runtime.Serialization.Json 后面发现首先,当然是项目是3.5的,只引用一个System.Runtime.Serialization 是不够的,还要添加 System.ServiceModelSystem.ServiceModel.Web的引用,OKSystem.Runtime.Serializ阅读全文

posted @ 2011-11-03 18:37 Lerry.Zhao 阅读(9) 评论(0) 编辑

2011年10月12日

摘要: <asp:repeater id="DataGrid_HotList" runat="server"> <ItemTemplate> <asp:textboxid="d_sortno"runat="server"Width="30px"ReadOnly=TrueText='<%#Container.ItemIndex+1%>'></asp:textbox> </ItemTemplate></asp:re阅读全文

posted @ 2011-10-12 14:44 Lerry.Zhao 阅读(11) 评论(0) 编辑

2011年7月25日

摘要: ASP.NET操作数据库通过对ADO.NET的基本讲解,以及讲解了一些数据源控件的基本用法后,本章将介绍一些ASP.NET操作数据库的高级用法,包括使用SQLHelper,以及数据源控件对数据的操作。本章是对前面的数据库知识的一种补充和提升。9.1 使用ADO.NET操作数据库上一章中介绍了ADO.NET的基本概念、ADO.NET的对象,以及如何使用ADO.NET。使用ADO.NET能够极大的方便开发人员对数据库进行操作而无需关心数据库底层之间的运行,ADO.NET不仅包括多个对象,同样包括多种方法,这些方法都可以用来执行开发人员指定的SQL语句,但是这些方法实现过程又不尽相同,本节将介绍A.阅读全文

posted @ 2011-07-25 21:20 Lerry.Zhao 阅读(156) 评论(0) 编辑

2011年5月9日

摘要: 对两个数据表同时进行insert操作处理,对它们的插入操作要么全部成功,要么都插入失败,否则只插入一个表成功会引起数据库的不一致。很显然,这是一个事务处理(transcation),要么commit成功,要么则rollback。在代码中,利用C#中提供的Transcation类来实现,代码如下: private void btn_submit_Click(object sender, System.EventArgs e) { string strconn = ConfigurationSettings.AppSettings["dsn"]; SqlConnection c阅读全文

posted @ 2011-05-09 23:34 Lerry.Zhao 阅读(59) 评论(0) 编辑