1、
GridView对数据的绑定有非常强悍的功能 ,也非常好用,我们经常用它来绑定数据,我们对数据也需要维护,通常是在GridView中放一个模板列,模板列中放一个按钮,点击此按钮,在 GridView的RowCommand事件中通过Response.Redrict()进行跳转到另一个页面进行编辑。例如:
<asp:TemplateField HeaderText="管理">
<ItemTemplate>
<asp:ImageButton ID="imgBtnManage" runat="server" CommandName="manage" ImageUrl="~/Images/manage_25X25.gif" CommandArgument='<%# Eval("ProductID") %>' />
</ItemTemplate>
</asp:TemplateField>
然后在Row_Command()事件中操作
protected void gvProduct_RowCommand(object sender, GridViewCommandEventArgs e)
{
string strProductId = e.CommandArgument.ToString();
int index = ((GridViewRow)((ImageButton)(e.CommandSource)).Parent.Parent).RowIndex;//获取当前点击前的行号
if (e.CommandName == "manage")
{
Response.Redirect("xx.aspx?id="+strProductId);
}
}
2、
我们还可以用下面一种方法操作,即在GridView中的模板列中放一个Html控件,如下:放的是一个Image,用它的onclick事件,用js实现,js函数可以用传参的形式传进去,
**注意,此处放置的是Image,是Html控件,如果你要通过数据绑定的方式即<%# Eval("**")%>这种方式对js函数传参数,只能用html控件的事件 ,不能用服务器控件(包括ImageButton的 OnClientClick事件皆不可)
<asp:TemplateField HeaderText="管理">
<ItemTemplate>
<img id="imgManage" src="Images/manage_25X25.gif" onclick="NavWindow('<%#Eval("CategoryID") %>','<%#Eval("ProductId") %>')" />
</ItemTemplate>
</asp:TemplateField>
如果要用服务器控件 ,且要绑定数据源的字段,则onclick事件,必须在后台通过控件的绑定数据源之后加上去,如:用Attributes.Add
((Button)e.Row.FindControl("btnEdit")).Attributes.Add("onclick", "return UniversalOpenWindowAndBreak(720,640,'NewStudentIssue.aspx?issueId=" + issueId + "');");
3、
也可以用下面的方式传脚本参数,这样可以统一打开对话框或者 窗口的函数
<asp:TemplateField HeaderText="管理">
<ItemTemplate>
<img onclick=="UniversalOpenWindow(650,450,'ScanOrgInfo.aspx?classid=<%#Eval("ClassID") %>')" />
</ItemTemplate>
</asp:TemplateField>
还可以这样添加事件,在页面的cs代码中添加客户端的事件
/// <summary>
/// 对GridView中每一行的linkButton添加客户端的onclick事件,打开一个查看团组的模态窗口
/// </summary>
/// <param name="ds">绑定到GridView中的数据源</param>
private void AddEvent(DataSet ds)
{
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
foreach (GridViewRow gr in gvClassInfoList.Rows)
{
LinkButton lkBtn = (LinkButton)gr.Cells[15].FindControl("lkBtnLookOrg");//dgOtherList.Items[i].Cells[2].FindControl("lnkPN");
//string str = ((Label)gr.Cells[0].FindControl("lblText")).Text;
string classid = gr.Cells[0].Text.ToString();
lkBtn.Attributes.Add("onclick", "return UniversalOpenWindow(660,450,'NewClass.aspx?classid='"+classid+")");
}
}
}
JS可以如下,随你自己写了:
<script type="text/javascript">
function NavWindow(currId,productId)
{
var strUrl = "AddProduct.aspx?currId="+currId +"&productId="+productId;//document.getElementById('btnAddProduct').getAttribute("cateid");
window.open(strUrl);
event.returnValue=false;//此事是防止客户端事件回发,进行提交PostBack
return false;
}
//打开模态与非模态对话框
function UniversalOpenWindow(w,h,fileName)
{
window.showModalDialog(fileName, argsObjectModalWindow, "dialogWidth:" + w + "px; dialogHeight:" + h + "px; center:Yes; help:No;
resizable:No; scroll:no; status:No")
}
function UniversalOpenWindowFree(w,h,fileName)
{
window.showModelessDialog(fileName, argsObjectModalWindow, "dialogWidth:" + w + "px; dialogHeight:" + h + "px; center:Yes; help:No;
resizable:Yes; scroll:No; status:No")
}
</script>
http://www.cnblogs.com/vihone/archive/2009/12/30/1636474.html
对于很多时候,我们在开发的时候,需要动态添加控件,包括Html控件,Asp.Net 控件。
js生成html控件
function AddProperty()
{
var count = document.getElementById('hidCount').value;
var str = "<BR> 属性名称:<input type=\"Text\" id=\"txtProperty"+count+"\" name=\"txtProperty"+count+"\" /> 属性描述:<input type=\"Text\" id=\"txtDesc"+count+"\" name=\"txtDesc"+count+"\" />";
count++;
document.getElementById('hidCount').value=count;
document.getElementById('catePro').innerHTML+=str;
}
因为要为生成的控件要能取其值,所以,必须必须指定其ID,可以先在页面放一个HiddenField控件,并指定默认值为0;当动态添加控件时,可以通过JS脚本改变其值,脚本如上。
<asp:HiddenField ID="hidCount" Value="0" runat="server" />
在页面 后台,可以通过以下方式取其值,如下:
int count = int.Parse(this.hidCount.Value);//取得生成控件的个数,保存在页面的HiddenField中,并可以得知其ID
for (int i = 0; i < count; i++)
{
string propName = string.Empty;
string propDesc = string.Empty;
if (!string.IsNullOrEmpty(Request["txtProperty" + i]))//判断是否存在
{
PIM.Model.CateProperty model = new PIM.Model.CateProperty();
propName = Request["txtProperty" + i].ToString();//,取得生成的控件的值
propDesc = Request["txtDesc" + i].ToString();
//......
}
}
二、动态生成Asp.Net服务器控件,并取其值
private void LoadProperty(int cateId)
{
HtmlGenericControl span = new HtmlGenericControl();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
StringBuilder strHtml = new StringBuilder();
if (i % 2 == 0)
{
strHtml.Append("<div >");
strHtml.Append("<div class=\"layout1\">");
}
else
{
strHtml.Append("<div >");
}
TextBox txt = new TextBox();
Label lbl = new Label();
HiddenField hdf = new HiddenField();//
lbl.ID = "lblProp" + i.ToString();
lbl.Text = ds.Tables[0].Rows[i]["PropName"].ToString() + ":";
txt.ID = "txtProp" + i.ToString();
hdf.ID = "hdfProp" + i.ToString();//
lbl.EnableViewState = true;
txt.EnableViewState = true;
hdf.EnableViewState = true;//
LiteralControl lc = new LiteralControl(strHtml.ToString());
lc.EnableViewState = true;
span.Controls.Add(lc);
span.Controls.Add(lbl);
span.Controls.Add(txt);
span.Controls.Add(hdf);//
if (i % 2 == 0)
{
span.Controls.Add(new LiteralControl("</div></div>"));
}
else
{
span.Controls.Add(new LiteralControl("</div>"));
}
}
}
动态生成的控件,当点击页面按钮时会刷新页面,所以,生成控件的方法不需要
if(!IsPostBack)
{
}
如果在PageLoad方法中,即使每回都动态加载都无法得到其数据,且动态生成的控件会消失,所以,根据Asp.Net生命周期,我们将生成控件在OnInit()方法中,
即重写此方法
protected override void OnInit(EventArgs e)
{
LoadProperty(cateID);//在OnInit中执行动态添加控件的方法,这样就会保存其状态视图
}
如果这些动态生成的控件,在生成的时候,就需要从数据库中取值,并为其赋值,可以在PageLoad中进行赋值操作,
这时就可以使用(!IsPostBack),且不会丢失其值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (!string.IsNullOrEmpty(Request["productId"]))
{
string productId = Request["productId"].ToString();
int parentId = int.Parse(ParentID);
LoadData(productId, parentId);//可以用方法对其赋值。。。具体实现省略。
}
}
}