关于ASP.NET网页编程的几个技巧

来源:互联网 发布:多用户微商城源码下载 编辑:程序博客网 时间:2024/04/20 12:00
 一、 页面服务器控件的排版问题

好多朋友在用服务器控件做页面时,虽然设置了控件的HorizontalAlign="Center"属性,但在页面显示的时候仍然显示在页面的左面。因此有好多朋友想了好多方法试图解决这个问题,比如在服务器控件的外面套了一个table,然后设置其align属性为center;或者使用
服务器控器
.可是这些根本不起任何作用,而实际上这些都是由于服务器的CSS属性所决定的,它在里面设置了控件的放置方式为绝对位置。因而处理方式也就很容易了,在服务器控件的属性里把POSITION: absolute;去掉,然后再设置其align属性为center就可以了。比如原先设置如下:

现在只要改成如下就可以了:


二、 让初学者为难的另一个问题就是DataList或DataGid内部绑定控件的事件处理问题

如果这里的服务器控件是页面上普通的控件的话,那很好办,在其属性窗口事件栏里对要进行绑定的事件双击就可以了。而对于DataList等控件里面的服务器却没有事件栏这一个选项。因而就有好多人就不知道怎么办了,而实际上很多人都需要这样的功能。根据我给一个朋友解决的过程来讲一下,我的朋友他对dataGrid里的每一条记录都要审核处理,因而他在每条记录里都放了一个checkbox(绑定是否已经被审核处理过),并且想要只要一点未选中的checkbox就能更新数据库。分析其过程,在他选中checkbox的时候就要去更新数据库,因而此时checkbox必须要执行回传;而且在回传时只有checkbox执行了动作并改变了状态,因而事件的触发、数据的更新也必须由它来完成,固它必须要有事件处理程序。原理就是这样子的,下面就是解决方案:
1. 设置相应checkbox的autopostback属性为true;
2.在datagrid的itemcreated事件中添加其中的checkbox事件处理,如下 private void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item)
{
CheckBox chk = (CheckBox)e.Item.FindControl("CheckBox1");

// 给项上的CheckBox添加出发事件

chk.CheckedChanged +=new EventHandler(this.CheckBox1Change);

}
3.在相应的事件处理方法中,如下:
private void CheckBox1Change (object sender,EventArgs e)
{
CheckBox myCheckBox = (CheckBox)sender;
int id;
if(myCheckBox.Checked == true) //判断是不是审核通过
{
id=myCheckBox.Text//这里我让更新的ID (主键)绑定到了CheckBox1的Text属性上去了.
据库处理;//省略
}
}
当然这里你也可以不让CheckBox1的Text属性来绑定主键,比如你可能让其中的其它控件来绑定主键,这样可以通过下面来访问他们.
TableCell myTableCell = (TableCell)(myCheckBox.Parent); //checkBox1的父容器,即所在行所在列的cell
DataGridItem item = (DataGridItem)myTableCell.Parent; //就是DataGrid等的一个行了
控件类型 my控件=item.FindControl(“yourcontolid”);
然后获取相关数据库主键值,然后执行数据库更新好作.

这里这个例子有点特别,因为datagrid里面的事件直接进行了事件处理,如果只是对datagrid控件等里面控件的状态进行读取并做相应的数据库更新的话,就更简单了,比如先把所有要审核并通过而未审核的记录的checkbox选中,然后由外部的一个button来引发事件处理,这样过程就简单多了,不用动态加载事件了,现在要做的就只是对datagrid里面的checkbox进行扫描,然后根据其状态执行相应的数据库好作就可以了.
比如下面的这段代码:
private void Button1_Clicked(object sender, System.EventArgs e)
{
foreach(ListItem li in DataGrid1)
{
CheckBox mycb=( CheckBox)li.FindControl(“ChockBox1”);
If(mycb.Checked==true)
{
获取关键字,执行数据库更新好作,同上.
}
}
}
三 关于textbox的一点思考与心得
这个还得从一个朋友问我的问题开始,朋友在做一个会员制站点,在登陆的时候,他想留一个测试用户帐号(就是在客户端看来用户名和密码都是已填了的)在上面,可是用asp.net来做的时候,密码textbox上的东东一到了客户端就成了空,而在设计的时候明明都是有初值,朋友甚至把在page_load事件里又初始化了一遍,结果还是一样---不行!而这些在从前的asp中是不存在任何问题的.下面是我的整个研究与解决过程:

首先我用服务控件的textbox,把它设成passmode,可是你在客户端看到的确实是空,无论是看源代码还是页面,估计是微软对passmode的textbox控件作了处理后才发到客户端了。

只得用普通的passwordfield(转成服务端控件以后的),结果却和passmode的textbox一样的效果,看来微软对这个控件在服务端也进行了处理.

只得用普通的passwordfield(没转成服务端控件),可是虽然微软说兼容asp,可是我用
string pass=Request.Form.Get("mypass");//mypass为passwordfield控件。得到的确实为空,这让我也很郁闷,不得再用以下方法测试。

我在用户点提交按纽的处理事件中用以下代码来查看所有由客户端向服务端提交的数据,如下:
int loop1, loop2;
System.Collections.Specialized.NameValueCollection coll;

// Load Header collection into NameValueCollection object.
coll=Request.Params;
// Put the names of all keys into a string array.
String[] arr1 = coll.AllKeys;
for (loop1 = 0; loop1{
Response.Write("Key: " + arr1[loop1] + "
");
// Get all values under this key.
String[] arr2=coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2{
Response.Write("Value " + loop2 + ": " + arr2[loop2] + "
");
}
}
里面确实没有mypass这个控件的值,可见微软对server控件和client控件作了严格的区分,不能用client控件来进行数据提交。

只得用下面的方法来模拟了,(汗,没办法啊!)
1.这里用password field控件,不转化为服务器端控件。设置其初值为58801353.
2.然后提交的时候不用获取密码值在,服务端用默认密码直接查询。

缺点:不能用其它密码提交(正式用户都不能登陆了,呵呵)。

换一个方法:
呵呵,在旁边设置一个链接,就是测试用户直接登陆的链接。其它的地方还用从前的服务端控件。

缺点:这个应该说没什么太大的缺点,不过还是不如原先asp实现的那么完美.

努力想(呵呵),……既然微软已经在发给用户之前对密码控件作了处理了,那么只能换个角度从客户端来实现了,这么一想,思路立马就很清晰了,用javascript很容易就能实现.
在html代码文件的head标记中添加一段javascript,如下:

上面中的passTextBox为一个asp:textbox且为passmode的textbox的ID,mypass是要设的密码

然后在body中添加onload="setPass()",如下:


原理没什么,很简单,一看就明白.
上面就是我在学习和使用ASP.NET的过程中的一点心得和体会,望大家不要见笑. 
原创粉丝点击