星期一, 七月 21, 2008

asp.net 自定义控件 Custom Control

转:http://dev.csdn.net/article/16/16199.shtm

  学习自定义控件的开发不仅可以使你开发出更灵活的系统更重要的是它可以使你加深对已有服务器控件的理解,得以更灵活的应用。

  较 之于asp,asp.net提供了更强大的功能,我比较喜欢它的代码分离技术和对诸如C#、VB.Net等强类型语言的使用,这是从开发者的角度来看的, 从用户的角度来看,会觉得它速度更快,运行更稳定,安全性也更高。不管怎么说,新技术的产生总会使许多人感到高兴,不过对开发者来说,坏消息是他们需要学 习更多新的知识。


  Asp.net 有了很多的改变,比如你可能会发现供我们操作的元素也和以前有了很大的不同,原来标准的HTML元素变成了现在的服务器控件,所谓服务器控件,就是在服务 器上运行,并可以映射到所有浏览器支持的标准 HTML 标记的控件,在你的web窗体中,凡是包含 runat="server" 属性声明的元素都叫做服务器控件(在VS.Net中的设计页面中,用一个小小的绿色箭头表示),你可以用原有的HTML元素并加上 runat="server" 属性使其变为一个服务器控件,这叫做HtmlControls,它可以直接映射到标准HTML标记;也可以使用.Net提供的全新的 WebControls,它比前者更抽象,功能也更加强大。不管采用哪一类控件,runat="server" 属性都将会使你可以以编程方式访问这些元 素。


  这 很容易理解,服务器控件就是在服务器端运行的控件,经过服务器端某些程序的解析再生成标准的HTML代码显示在我们的浏览器上,事实上,Web Form之所以可以提供最大可能的浏览器兼容性也是基于此理。与通常的理解稍稍有些不同,在asp.net中,一个页面(Page),一个验证控件,一个 用户控件(User Control),都可以看作是一个独立的控件,它来自于其它控件的组合。除了使用.Net提供的一系列控件外,你还可以到网上找一些免费的控件,www.asp.net中的Control Gallery一栏就收集了很多常用的Control。


  在asp.net 中,(传统意义上)可供你开发的控件实际上有两种:Custom ControlUser Control。Custom Control 是纵向的,是对系统本身控件的继承和扩充,在程序中以DLL文件形式存在,User Control 则是横向的,是对系统本身控件的组合,在系统中以.ascx为后缀名。这两种控件功能相同,都可以为开发人员提供可复用的可视化UI组件,相比之下前者具 有更大的灵活性,同时开发起来比较复杂,而后者容易开发,但可重用性就比较差。一般来说用户会先用User Control来开发,只有当其不堪重用的时候才转而使用Custom Control。


  事实上,用户自己开发Custom Control并不是一件很困难的事,只需要定义一个直接或间接从 Control 派生的类并重写它的 Render 方法即可。System.Web.UI.Control与System.Web.UI.WebControls.WebControl两个类是服务器控件 的基类。 Control 类定义了所有服务器控件共有的属性、方法和事件。其中包括控制控件执行生命周期的方法和事件,以及 ID、UniqueID、Parent、ViewState 和 Controls(子控件集合)等属性。Control 没有用户界面 (UI) 特定的任何功能。如果创作的控件没有提供 UI,或者组合了其他呈现其自己的 UI 的控件,则从 Control 派生。 WebControl 类是从 Control 派生的,并为 UI 功能提供附加的属性和方法。这些属性包括 ForeColor、BackColor、Font、BorderStyle、Height 和 Width。WebControl 是 ASP.NET 中 Web 服务器控件系列的基类。如果控件呈现 UI,则从 WebControl 派生。


  可以重写从基类继承的属性、方 法和事件,并可以将新的属性、方法和事件添加到自定义控件中,所前所述,我们使用重写Render方法来实现对HTML代码的输出。Render 方法采用 System.Web.UI.HtmlTextWriter 类型的参数。控件要发送到客户端的 HTML 作为字符串参数传递到 HtmlTextWriter 的 Write 方法。


  下面我们使用VS.Net来开发一个简单的自定义控件(使用VS.Net的原因是为了方便开发者调试,在正式开发中我们经常使用的也是 VS.Net)。


首先,新建一个空白解决方案,然后为其添加两个项目,一个名为MyControls的Web控件库项目和一个叫做Web的Web应用程序项目,后者用于测试我们开发出的控件。


在Web 项目上点击右键,选择依赖项,使项目Web取决于MyControls,接着再为Web项目添加MyControls的引用(编译成的 MyControls.dll文件后被copy到Web目录的Bin文件夹下,你可以在任何地方使用这个MyControls.dll文件)。


在MyControls项目中添加一个Web自定义控件并命名为MyControl.cs,接着在Web项目中的WebForm1.aspx文件首行添加如下代码(用于向页面注册此控件):

<%@ Register TagPrefix="ccs" Namespace="MyControls" Assembly="MyControls" %>

在<form>标记之间添加如下代码(添加此控件到页面上):

OK,一个带有Text属性的自定义控件已经完成了,现在就可以运行它并观看效果了。
这个控件的结果仅仅是将一行文本输出到浏览器并显示出来,但是我们平时所用到的控件,小到如Label,大到如DataGrid,都是基于这一原理开发出来的。接着我们看一下这个自定义控件源文件(MyControl.cs)的组成



using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace MyControls
{
// Attribute DefaultProperty指定组件的默认属性,ToolboxData指定当从IDE工具中的
//工具箱中拖动自定义控件时为它生成的默认标记
[DefaultProperty("Text"),
ToolboxData("<{0}:MyControl runat=server>")]
//类MyControl派生自WebControl
public class MyControl : System.Web.UI.WebControls.WebControl
{
private string text;
//Attribute Bindable指定属性是否通常用于绑定

//Category指定属性或事件将显示在可视化设计器中的类别

//DefalutValue用于指定属性的默认值
[Bindable(true), Category("Appearance"), DefaultValue("")]
public string Text
{
get
{
return text;
}
set
{
text = value;
}
}
//重写WebControl的Render方法,采用HtmlTextWriter类型的参数
protected override void Render(HtmlTextWriter output)
{
//发送属性Text的值到浏览器
output.Write(Text);
}
}
}



========

Imports Microsoft.VisualBasic
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.ComponentModel

' Attribute DefaultProperty 指定组件的默认属性,
' ToolboxData 指定当从 ide 工具箱中拖动空间时为他生成的默认标记
<bindable(true), Category("杂项"), DefaultProperty("text"), ToolboxData("<{0}:MyControl runat=server><{0}:MyControl-->")> _
Public Class myControl

Inherits System.Web.UI.WebControls.WebControl
Private _text As String
Public Property Text() As String

Get

Return _text

End Get
Set(ByVal value As String)

_text = value

End Set

End Property
' 重写 WebControl 的 Render 方法, 采用HtmlTextWrite 类型的参数:
Protected Overrides Sub render(ByVal output As System.Web.UI.HtmlTextWriter)

output.Write(Text)

End Sub

End Class

星期五, 七月 18, 2008

php5 读 MySQL5 utf8 中文乱码

这两天就弄MySql 了
开始 .net 乱码,现在 php5 也乱码,php5 下是这样解决的:

编码:
为了使phpmysql更好的支持中文,将采用UTF-8编码,相关配置如下。
1、mysql的配置,在安装mysql后,配置时将字符编码改为UTF-8,即选中第二项。对具体的数据库中的每一个表的编码改为UTF-8
2、Apache中不需要更改,因为已包含
UTF-8编码
3、php中要对php.ini文件中line 637: extension=php_mbstring.dll 前的分号除掉,并且必需修改mb_string的相关编码配置,修改后的内容为:
line 1164: mbstring.language = utf-8
line 1169: mbstring.internal_encoding = utf-8
line 1172: mbstring.http_input = auto
line 1176: mbstring.http_output = utf-8
line 1183: mbstring.encoding_translation = On
line 1187: mbstring.detect_order = auto
line 1191: mbstring.substitute_character = utf-8;
line 1201: mbstring.func_overload = 1
所有行号均对应的是php5.1.6 版本的php.ini-recommand
4、在语句
$mysql_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
后加上

mysql_query("SET NAMES 'UTF8'");
注意:UTF8不能写成UTF-8,否则不起作用


下面的是在百度上搜到的:

以前的国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,没想到新的主机的Mysql是5.0版本的,导入数据 后,用Php读出来全是问号,乱码一片,记得我以前也曾经有过一次切换出现乱码的经验,原因肯定是Mysql版本之间的差异问题。

只好查资料,发现了一个解决方法,就是在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于GBK的数据库则使用SET NAMES GBK,代码如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");


经过我的测试,我发现上面第二个方法就可以让 php5 读出的 MySQL5 的以utf8编码保存的中文字符。还有,以下这个是什么意思?:
$charset="latin1";
mysql_query("SET NAMES '".$GLOBALS['charset']."'");
就可以了

在写入数据库之前加上这段代码应该就能解决问题了,我前几天也碰到了这个问题,然后查遍论坛后,把所有文件保存成UTF8后,加上这段代码就完成,希望能解决你的问题
$sql = 'set names "utf8"';
if (!mysql_query($sql))
{
$this->error = 'cannot set character_sets';
$this->constructed = 0;
return false;
}


......

星期四, 七月 17, 2008

MySQL 的字符集

在my.cnf中加如下代码:
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8


如果不加以上代码,那么即便MYSQL编译安装时指定的编码是UTF8,那么在建库时其默认编码仍是LATIN1,而由于字符集的继承性,库中的表也是LATIN1的了。

这里列几条命令,大家可以自己试下:
1.列出MYSQL支持的所有字符集:
SHOW CHARACTER SET;

2.当前MYSQL服务器字符集设置
SHOW VARIABLES LIKE 'character_set_%';

3.当前MYSQL服务器字符集校验设置
SHOW VARIABLES LIKE 'collation_%';

4.显示某数据库字符集设置
show create database 数据库名;

5.显示某数据表字符集设置
show create table 表名;

6.修改数据库字符集
alter database 数据库名 default character set 'utf8';

7.修改数据表字符集
alter table 表名 default character set 'utf8';

8.建库时指定字符集
create database 数据库名 character set gbk collate gbk_chinese_ci;

9.建表时指定字符集
CREATE TABLE `mysqlcode` (
`id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`content` VARCHAR( 255 ) NOT NULL
) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
还有,改了数据库的编码,数据库要重建才有效,不仅仅是删除表,要连整个数据库都删除再重建原来的表才可以,反正我是这么解决的。

asp.net 调用 MySql 的参数

这个名起得有点不对题,我的意思是,在asp.net 写入 MySQL 的时候,用传入参数方式,开始怎么都不成功,在网上搜索了一圈以后才知道,原来MySQL 的参数名要用 ? 开头的。放在这的这篇文字就是想记住这点东西,因为以前出现过找到的东西找不到了。

一个例子:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim oconn As New MySqlConnection("Data Source=192.168.1.253; Database=db1; user=walker; password=mima;")
oconn.Open()
Dim strQuery As String = "insert into t1 (uname, ucont) values (?un, ?uc)"
Dim oCmd As New MySqlCommand(strQuery, oconn)

Dim pun As MySqlParameter = New MySqlParameter("?un", MySqlDbType.VarChar, 20)
Dim puc As MySqlParameter = New MySqlParameter("?uc", MySqlDbType.VarChar, 255)
pun.Value = TextBox1.Text
puc.Value = TextBox2.Text
Dim paras As MySqlParameter() = {pun, puc}
Dim p As MySqlParameter
For Each p In paras
oCmd.Parameters.Add(p)
Next
'oCmd.Parameters.Add(New MySqlParameter("@un", MySqlDbType.VarChar, 20))
'oCmd.Parameters.Add("?uc", MySqlDbType.VarChar, 255).Value = TextBox2.Text
'oCmd.Parameters("@un").Value = TextBox1.Text
'oCmd.Parameters("@uc").Value = TextBox2.Text
oCmd.Connection = oconn
'strQuery = "insert into t1 (uname, ucont) values ('" & TextBox1.Text & "','" & TextBox2.Text & "')"
oCmd.CommandText = strQuery
oCmd.CommandType = CommandType.Text
'lblMsg.Text = oCmd.Parameters("@un").Value.ToString
Dim iVal As Integer = 0
iVal = oCmd.ExecuteNonQuery
lblMsg.Text &= "结果:" & iVal.ToString & " ."
oCmd.Parameters.Clear()
oconn.Close()
' _gb()

End Sub
有点乱哈 ....

MySQL 权限的定义

格式:
GRANT 权限 on 数据库.表名 to 用户名@登录主机 identified by "密码";
Grant [gra:nt] n. 拨款 vt. 授予,同意,承认

实例如下:
创建一个名为 ahwei 的用户,密码 1234 拥有 localhost 的 phpbook 的所有权限:

mysql> GRANT ALL PRIVILEGES ON phpbook.* TO ahwei@localhost IDENTIFIED BY '1234';


创建一个新用户名为:walker:

mysql> GRANT select, update, insert, delete ON *.* TO walker@192.168.11.1 identified BY "mima";


看结果:

mysql> use mysql;
mysql> select host, user, password from user;

mysql>

就看到了。

主机名:

将主机名字段值改为 "%" 就表示在任何客户端机器上都可以用 walker 名登录,可以在开发时设为 "%" 。

UPDATE user SET host = '%' WHERE user = 'walker' ;