Tracy.Bai

Focus on Data analysis and Mining

导航

asp.net tips汇总

1. 实用、简单的URL重写

< system.web >
<
urlMappings enabled ="True">
<
add url ="~/guid.html" mappedUrl ="guid_{492f3e0b-848e-11da-9550-00e08161165f}.html"/>
</
urlMappings >
< /system.web>

url为客户端看到的url,mappedUrl为实际的Url

2.页面之间传值使用

Page.PreviousPage 属性,获取向当前页传输控件的页。 找到相应的控件

eg: TextBox t = ((TextBox)(PreviousPage.FindControl("Textbox1")));
Calendar c = ((Calendar)(PreviousPage.FindControl("Calendar1")));

Textbox1为前一个页面的控件。

3.利用JavaScript选择GridView行

第一步:在页面中添加GridView控件和一个按钮,隐藏字段

<
          input 
          id
          ="hdnEmailID" 
          type
          ="hidden" 
       value
          ="0" 
          runat
          ="server" 
          name
          ="hdnEmailID" />
<
          asp
          :
          GridView 
          ID
          ="gvUsers" 
          runat
          ="server" 
              
          AutoGenerateColumns
          ="False" 
              
          OnRowDataBound
          ="gvUsers_RowDataBound">
    <
          Columns
          >
        <
          asp
          :
          BoundField 
          DataField
          ="Email" 
          HeaderText
          ="邮件" 
          ReadOnly
          ="True" />
        <
          asp
          :
          BoundField 
          DataField
          ="Name" 
          HeaderText
          ="姓名" 
          ReadOnly
          ="True" />
    </
          Columns
          >
</
          asp
          :
          GridView
          >
<
          asp
          :
          Button 
          ID
          ="btnSelect" 
          runat
          ="server" 
            OnClick
          ="btnSelect_Click" 
          Text
          ="Select" />

            
第二步:编写JS函数来获取选择行的id,并改变背景颜色


            <
            script 
            language
            ="javascript" 
            type
            ="text/javascript">
    var lastRowSelected;
    var originalColor;
    function GridView_selectRow(row, EmailID)
    { 
          var hdn=document.form1.hdnEmailID;
          hdn.value = EmailID;
          if (lastRowSelected != row)
            {
            if (lastRowSelected != null)
             {
              lastRowSelected.style.backgroundColor = originalColor;
              lastRowSelected.style.color = 'Black'
              lastRowSelected.style.fontWeight = 'normal';
             }
          originalColor = row.style.backgroundColor
          row.style.backgroundColor = 'BLACK'
          row.style.color = 'White'
          row.style.fontWeight = 'normal'
          lastRowSelected = row;
          }
    }

    function GridView_mouseHover(row)
    {
        row.style.cursor = 'hand';
    }
</
            script
            >
          

略过一步,就是绑定数据,大家自行完成。
第三步:在RowDataBound事件中添加JS函数调用。
protected void gvUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.ID = e.Row.Cells[0].Text;
        e.Row.Attributes.Add("onclick", 
            "GridView_selectRow(this,'" + e.Row.Cells[0].Text + "')");
        e.Row.Attributes.Add("onmouseover", "GridView_mouseHover(this)");
    }
}

第四步:完成按钮事件
在选择/删除按钮单击事件我们可以用hdnEmailID.Value方式获得行的id。然后利用id来完成操作;这里为了演示,我只是输出了这个值。
protected void btnSelect_Click(object sender, EventArgs e)
{
    Response.Write(hdnEmailID.Value);
}
4. ASP.NET AJAX 中,如何用 JavaScript 调用服务器端的方法?

这里不是指调用简单的 PageMethod,因为静态方法是不能操作当前页面的控件的,所以静态的 PageMethod 作用就跟普通的 WebService 一样,比较局限。
那么,调用一般的服务器端方法,其实就是发起一个异步回调。最简单的实现办法,是通过 UpdatePanel 来做。
首先定义一个隐藏的 LinkButton,在其处理事件中,去调用我们要执行的操作:
< asp:LinkButton ID ="linkUpdatePosts" runat ="server" style ="display:'none';" OnClick ="linkUpdatePosts_Clicked" />

// 刷新帖子列表(供客户端 js 调用)
protected void linkUpdatePosts_Clicked( object sender, EventArgs e)
{
LoadPosts();
}

然后 JavaScript 中就可以定义函数来触发这个 LinkButton 的回发:
// 刷新帖子列表
function refreshPosts() {
__doPostBack(
' <%= linkUpdatePosts.UniqueID %> ' , '' );
}

// 刷新帖子列表
function refreshPosts() {
__doPostBack('<%= linkUpdatePosts.ClientID %>'.split('_').join('$'), '');
}

            这里注意 split('_').join('$') 的用法,是因为作为 __doPostBack 参数的控件标志符是用 $ 分隔的,而 ClientID 是用 _ 分隔,要在两者之间进行下转换。
          
          
5. 如何获取 GridView 编辑状态下单元格里的值?

还在使用这样的代码吗?
var txtName = grid1.Rows[e.RowIndex].Cells[ 0 ].FindControl( " txtName " ) as TextBox;
if (txtName != null )
{
// 读取值
//
}

其实这些工作(在单元格中查找控件,并尝试获取其中的值)已经被封装了。现在,只要调用 ExtractValuesFromCell 方法即可。
而该方法也被很多种列类型所支持:
DataControlField, BoundField, AutoGeneratedField, CheckBoxField, ImageField, TemplateField, DynamicField

你可以在 GridView 的 RowUpdating, RowDeleting 等事件中使用它。利用该方法,可以将值提取到所需的字典里去,然后再从字典中读取。这些字典包括:e.Keys, e.NewValues, e.OldValues 等。
一小段例子代码:
// 更新
protected void grid1_RowUpdating( object sender, GridViewUpdateEventArgs e)
{
var row
= grid1.Rows[e.RowIndex];
// 提取 Id 字段的值
grid1.Columns[ 0 ].ExtractValuesFromCell(
e.Keys,
row.Cells[
0 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );

// 提取 Name 字段的值
grid1.Columns[ 1 ].ExtractValuesFromCell(
e.NewValues,
row.Cells[
1 ] as DataControlFieldCell,
DataControlRowState.Edit,
true /* include readonly */ );

var id
= int .Parse(e.Keys[ " id " ].ToString());
var name
= ( string ) e.NewValues[ " name " ];

// 执行相关的数据库更新操作
//
}

这样,在大多数场合我们可以尽可能多的使用 BoundField,并且也能正确读取到其编辑时的值,省下自定义 TemplateField 的一堆代码了。 1. 如何让页面回发(PostBack)后,滚动条位置保持不变?
在页面后台代码的Page_Load事件中,添加如下代码:
this.Page.MaintainScrollPositionOnPostBack = true;
上面的代码在.net1.1中等价于
this.Page.SmartNavigation = true;

2. 如何在IE中让文本框刷新之后还保持原值
<HTML>
<HEAD>
<META NAME="save" CONTENT="history">
<STYLE>
.saveHistory
{behavior:url(#default#savehistory);}
</STYLE>
</HEAD>
<BODY>
<INPUT class=saveHistory type=text id=oPersistInput>
</BODY>
</HTML>

posted on 2008-10-08 22:12  Love Fendi  阅读(267)  评论(0编辑  收藏  举报