GridView控件的一些总结三 gridview控件的用法

7.DataKeyField和DataKeys

DataKeyField是绑定的字段,DataKeys是绑定字段的绑定数据的集合。如DataKeyField="Id"DataKeys保存的就是Id字段值的集合。

DataKeyField指定数据源的键字段,指定的字段用于填充DataKeys集合,DataKeys集合访问数据列表控件中每个记录的键值,此集合自动用DataKeyField属性指定的字段中的值填充。

DataKeyField是字段名,DataKeys是对应的字段值,没有DataKeyField就没有DataKeys。

8.GridView的DataKeyNames属性

DataKeyNames表示主键的列名,可以通过GridViewEntity.DataKeys[RowIndex]["ColumsName"]来获取他的值,当然它是不会显示出来的,其实我是在一个用SqlDataSource中发现的,看到了有这么一个主键而实现更新,当然在我们多层开发中也不能缺少这个。当我们在用Template时怎么取得值呢?我们可以把那个列也设为DataKeyNames中,记得多个要用","隔开。

如果没有设置成DataKeyNames,那只能通过GridViewEntity.Rows[RowIndex].Cell[Index].Text来得到值了,不知老兄有没有看到一些HTML字符呢? 这个最是经常见得了,不用担心我们可以用HttpUnility.HtmlDecode()来解决他!

在我们使用GridView的过程中,经常会遇到这样的问题,我们选择某一行进行编辑,或选择某一行删除或者.......时,我们需要获取当前行的某些信息,尤其是当前行的主键信息,

主键信息一般不显示在页面,此时我们有三种方法来处理。

第一种是使用DataKeyNames,这里要重点介绍的。

第二种是使用按钮的CommandArgument属性邦定需要的信息。

第三种是最古老最通用的方法使用隐藏的方法显示。

第一种方法:使用DataKeyNames,DataKeyNames可邦定一列,也可邦定多列

前台:DataKeyNames="FID"绑定一个值

后台:GridView1.DataKeys[e.Row.RowIndex].Value.ToString();

前台:DataKeyNames="FID,FName"绑定两个值

后台:GridView1.DataKeys[e.Row.RowIndex].Values[0].ToString();

后台:GridView1.DataKeys[e.Row.RowIndex].Values[1].ToString();

或者

后台:GridView1.DataKeys[e.Row.RowIndex].Values["FID"].ToString();

后台:GridView1.DataKeys[e.Row.RowIndex].Values["FName"].ToString();

第二种方法:是用按钮的CommandArgument属性邦定需要的信息。

典型的例子:下载附件列(有附件的显示下载链接,无附件的显示为空)
<asp:TemplateColumnHeaderText="附件">
<HeaderStyleWidth="7%"></HeaderStyle>
<ItemTemplate>
<asp:LinkButton id="LinkButton1"CommandName="download" CommandArgument='<%#DataBinder.eval_r(Container.DataItem,"attached_file")%>' runat="server"Visible='<%# ((DataBinder.e val_r(Container.DataItem,"attached_file").ToString()) != "")%>'>下载</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>

在dgHKStock_ItemCommand事件中:
if ("download" == e.CommandName)
{
mybc.SystemOverTime0();// 判断Session是否过期
mybc.RightManage("16010500");// 判断用户是否有打开此网页的权限
mybc.HTTP_DownloadFile(e.CommandArgument.ToString()); //取得当前存货信息的附件存放路径

}

最古老最通用的方法使用隐藏的方法显示。

<styletype="text/css">
.test{
display:none;
}
</style>

<asp:TemplateFieldHeaderText="姓名" SortExpression="name" ItemStyle-CssClass="test"HeaderStyle-CssClass="test">
<ItemTemplate>
<asp:Label ID="Label1" runat="server"Text='<%# eval_r("name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>

把隐藏列转成模版列,通过FindControl访问模版列的内容:

<asp:TemplateFieldVisible="false">
<ItemTemplate>
<asp:Label runat="server"Text='<%#eval_r("id") %>'ID="lblId"></asp:Label>
</ItemTemplate>
</asp:TemplateField>

protected voidGridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
LabellblId=GridView1.Rows[e.NewEditIndex].Cells[0].FindControl("lblId")as Label;
Response.Write(lblId.Text);
}

9.运行错误,提示说无法将类型“string”隐式转换为“string[]”

this.GridView1.DataKeyNames= "userID";

string[] user=newstring[]{"userID"};

this.GridView1.DataKeyNames=user;

10.如何在ASP.NET中获得RowIndex的简单方法

为什么需要在RowCommandevent获得RowIndex呢?通常一个Table的PK或FK并不会显示在GridView上,而会设定在DataKeyNamesproperty,然后再RowCommandevent根据RowIndex读出该row的PK或FK,所以第一步,必须先能在RowCommand获得RowIndex。

 ASP.NET 1.xDataGrid

在ASP.NET1.x的DataGrid,若要使用LinkButton,一样得放在TemplateColumn内,且ItemCommandevent的e.Item.ItemIndex就可抓到RowIndex。

当在DataGrid点下FirstName后,会在下方的Label显示LastName,LastName是此例的DataKey。

<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<%@PageLanguage="C#"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">

protectedvoidPage_Load(objectsender,EventArgse){
if(!IsPostBack)
DataGrid1_DataBind();
}

protectedvoidDataGrid1_DataBind(){
stringstrSQL="SELECTTOP10"+
"fname,"+
"lname"+
"FROMemployee";
SqlConnectioncon=newSqlConnection(@"DataSource=.sqlexpress;Initial
Catalog=pubs;IntegratedSecurity=True");
SqlDataAdapterda=newSqlDataAdapter(strSQL,con);
DataSetds=newDataSet();

try{
da.Fill(ds);
}
catch(Exceptionerr){
Response.Write(err.ToString());
return;
}
finally{
if((con!=null)&&(con.State==ConnectionState.Open))
con.Close();
}

DataGrid1.DataSource=ds;
DataGrid1.DataKeyField="lname";
DataGrid1.AutoGenerateColumns=false;
DataGrid1.DataBind();
}

protectedvoidDataGrid1_ItemCommand(objectsource,DataGridCommandEventArgse){
if(e.CommandName=="Select")
Label1.Text=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
}
</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>UntitledPage</title>
</head>
<body>
<formid="form1"runat="server">
<asp:DataGridID="DataGrid1"runat="server"OnItemCommand="DataGrid1_ItemCommand">
<Columns>
<asp:TemplateColumnHeaderText="FirstName">
<ItemTemplate>
<asp:LinkButtonID="LinkButton1"runat="server"CommandName="Select"
Text='<%#DataBinder.eval_r(Container.DataItem,"fname")%>'>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
<asp:LabelID="Label1"runat="server"></asp:Label>
</form>
</body>
</html>

只需在ItemCommandevent的e.Item.ItemIndex就可以轻松的抓到RowIndex。

ASP.NET 2.0GridView

ASP.NET2.0就改用SqlDataSource和GridView了,LinkButtom一样得放在TemplateField,但GridView没有ItemCommandevent,取而代之的是RowCommand event。

<%@PageLanguage="C#"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">

protectedvoidPage_Load(objectsender,EventArgse){
if(!IsPostBack)
GridView1_DataBind();
}

protectedvoidGridView1_DataBind(){
SqlDataSource1.ConnectionString=@"DataSource=.sqlexpress;Initial
Catalog=pubs;IntegratedSecurity=True";
SqlDataSource1.SelectCommand="SELECTTOP10"+
"fname,"+
"lname"+
"FROMemployee";
GridView1.DataSourceID=SqlDataSource1.ID;
GridView1.DataKeyNames=newstring[]{"lname"};
GridView1.AutoGenerateColumns=false;
}

protectedvoidGridView1_RowCommand(objectsender,GridViewCommandEventArgse){
if(e.CommandName=="Select"){
introwIndex=((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
Label1.Text=GridView1.DataKeys[rowIndex].Value.ToString();
}
}
</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>UntitledPage</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:GridViewID="GridView1"runat="server"OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:TemplateFieldHeaderText="FirstName">
<ItemTemplate>
<asp:LinkButtonID="LinkButton1"runat="server"CommandName="Select"
Text='<%#eval_r("fname")%>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<asp:LabelID="Label1"runat="server"></asp:Label>
<asp:SqlDataSourceID="SqlDataSource1"runat="server"></asp:SqlDataSource>
</form>
</body>
</html>

CommandSource传的是按下去的LinkButton,不过由于传回的是Object,就得自行转成LinkButton,但由于我们想知道的是RowIndex,而LinkButton是包含在GridViewRow内,所以透过NamingContainer传回目前的GridViewRow,但传回的是Control,所以需在转成GridViewRow后才能有RowIndexproperty。

GridView是DataGrid的继承人,但不少写法和DataGrid并不一样,GridView很多地方比DataGrid更强更好用,但这个例子却发现GridView比DataGrid麻烦些。

11.gridview使用TemplateField中的LinkButton时如何在RowCommand事件中找到当前行index的方法

ASP.NET2.0中的GRIDVIEW控件真是非常奇怪,不知道MS是怎么考虑的,在GRIDVIEW里,行索引被放在了CommandArgument里面,而不是像DataGrid那样可以利用this.MyDataGrid.DataKeys[e.Item.ItemIndex].ToString()方便的取出主键值,同时我们注意到,如果使用默认的CommandField,<asp:CommandFieldShowDeleteButton="True" ShowEditButton="True"/>则可以在RowCommand中使用如下代码取出行号:

protected voidGridView1_RowCommand(object sender, GridViewCommandEventArgse)

{

//编辑按扭

if (e.CommandName== "Edit")

{

//设置编辑行高亮显示

this.GridView1.EditRowStyle.BackColor= Color.FromName("#F7CE90");

//string

index=this.GridView1.DataKeys[Convert.ToInt32(e.CommandArgument)].Value.ToString();

int index =Convert.ToInt32(e.CommandArgument);

GridViewRow row =GridView1.Rows[index];

string xh3 =row.Cells[3].Text;

}

}

但问题是,CommandField的可操控性是很底的,我们一般习惯于使用模版列来订制操作按钮,如下:

<asp:TemplateFieldHeaderText="操作" ShowHeader="False">

<EditItemTemplate>

<asp:LinkButtonID="LinkButton1" runat="server" CausesValidation="True"CommandName="Update"Text="更新"></asp:LinkButton>

<asp:LinkButtonID="LinkButton2" runat="server" CausesValidation="False"CommandName="Cancel"Text="取消"></asp:LinkButton>

</EditItemTemplate>

<ItemTemplate>

<asp:LinkButtonID="LinkButton1" runat="server" CausesValidation="False"CommandName="Edit" Text="编辑"></asp:LinkButton>

<asp:LinkButtonID="LinkButton2" runat="server" CausesValidation="False"CommandName="Select"Text="选择"></asp:LinkButton>

<asp:LinkButtonID="LinkButton3" runat="server" CausesValidation="False"CommandName="Delete" Text="删除"></asp:LinkButton>

</ItemTemplate>

</asp:TemplateField>

随之而来,问题出现了,运行报错:输入字符串的格式不正确,Convert.ToInt32(e.CommandArgument)中e.CommandArgument转换为字符串为空。当我们把CommandField转换为模版列时,默认的CommandArgument属性丢失了!!!

思考了两天,翻阅了网上的资料,最后在MSDN文档中发现,呈现GridView 控件之前,必须先为该控件中的每一行创建一个 GridViewRow 对象。在创建 GridView控件中的每一行时,将引发 RowCreated事件。这使我们可以提供一个这样的事件处理方法,即每次发生此事件时都执行一个自定义例程(如在行中添加自定义内容,当然也可以添加e.CommandArgument属性为模版列里的LinkButton)。

GridViewRowEventArgs对象将被传给事件处理方法,随之我们可以访问正在创建的行的属性。若要访问行中的特定单元格,可以使用GridViewRowEventArgs 对象的 Cells 属性。使用 RowType属性可确定正在创建的是哪一种行类型(标题行、数据行等等)。

好了,原来我们可以利用RowCreated事件来为模版列中LinkButton写入CommandArgument事件。

下面的代码示例演示如何使用RowCreated 事件将正在创建的行的索引存储在该行中所包含的 LinkButton 控件的 CommandArgument属性中。这允许您确定在用户单击 LinkButton 控件按钮时包含该控件的行的索引。

///<summary>

///为模版列LinkButton写入CommandArgument事件

///</summary>

///<paramname="sender"></param>

///<paramname="e"></param>

protected voidGridView1_RowCreated(object sender, GridViewRowEventArgse)

{

if (e.Row.RowType== DataControlRowType.DataRow)

{

/ Retrieve theLinkButton control from the first column.

LinkButtonLinkButton1 =(LinkButton)e.Row.FindControl("LinkButton1");

// Set theLinkButton's CommandArgument property with the row'sindex.

LinkButton1.CommandArgument= e.Row.RowIndex.ToString();

}

}

好了,其余的代码不变,在GridView1_RowCommand中的代码不变.

比如再一个单元格中要加入两个按钮:

.aspx页面:

<asp:TemplateFieldHeaderText="导航序号" ShowHeader="False">

<ItemTemplate>

<asp:LabelID="Label3" runat="server" Text='<%#eval_r("Modsort")%>'></asp:Label>

<asp:ImageButtonID="ImageButton1" runat="server"

ImageUrl="/Manager/enterpriseManager/Mod/Images/up.png"Height="18px"

Width="17px"CausesValidation="false" CommandName="up" Text="up"/>&nbsp;

<asp:ImageButtonID="ImageButton2" runat="server"

ImageUrl="/Manager/enterpriseManager/Mod/Images/down.png"Height="18px"

Width="17px"CausesValidation="false" CommandName="down" Text="down"/>

</ItemTemplate>

<HeaderStyleBackColor="#C00000" />

<ItemStyleHorizontalAlign="Center" />

</asp:TemplateField>

cs文件:

在RowCreated事件里面(注意这里很重要)

protected voidGridView_RowCreated(object sender, GridViewRowEventArgse)

{

if (e.Row.RowType== DataControlRowType.DataRow)

{

ImageButtonImageButton1 = e.Row.FindControl("ImageButton1") asImageButton;

ImageButton1.CommandArgument= e.Row.RowIndex.ToString();

ImageButtonImageButton2 = e.Row.FindControl("ImageButton2") asImageButton;

ImageButton2.CommandArgument= e.Row.RowIndex.ToString();

}

}

在RowCommand事件里面:

protected voidmod_RowCommand(object sender, GridViewCommandEventArgse)

{

if (e.CommandName== "up")

{

ClientScript.RegisterStartupScript(GetType(),"","<script>alert('我要UP!');</script>");

}

if(e.CommandName=="down")

{

ClientScript.RegisterStartupScript(GetType(),"","<script>alert('我要DOWN!');</script>");

}

}

12.实现GrdView分页的功能

操作如下:

1、更改GrdView控件的AllowPaging属性为true。

2、更改GrdView控件的PageSize属性为任意数值(默认为10)

3、更改GrdView控件的PageSetting->Mode为Numeric等(默认为Numeric)该属性为分页样式。

GridView属性设置好了,从页面上也能看到分页样式。

现在开始实现分页的功能:

1、在<<asp:GridViewID=......>后添加,OnPageIndexChanging="GridView1_PageIndexChanging"

2、在对应的aspx.cs中添加:

protected void GridView1_PageIndexChanging(object sender,GridViewPageEventArgs e)

{

GridView1.PageIndex = e.NewPageIndex;

InitPage(); //重新绑定GridView数据的函数

}

3、

GridView1.PageIndex= e.NewPageIndex;

完了之后再重新绑定一下GridView就好了。

13RowDataBound事件
在创建gridView控件时,必须先为GridView的每一行创建一个GridViewRow对象,创建每一行时,将引发一个RowCreated事件;当行创建完毕,每一行GridViewRow就要绑定数据源中的数据,当绑定完成后,将引发RowDataBound事件。如果说我们可以利用RowCreated事件来控制每一行绑定的控件,那么我们同样可以利用RowDataBound事件来控制每一行绑定的数据,也就是让数据如何呈现给大家。
还举同样的例子,在数据表中,存在性别列,上面我们用DropListDown控件的DataBounding来表示出了中文的性别,但是毕竟不太美观,我们现在可以利用Label控件和RowDataBound事件来实现完美的中文性别显示。RowDataBound,
首先,还是把性别列,设置为模板列,并添加一个Label控件,将Label控件绑定到数据源的性别段,然后我们在GridView控件属性的事件列表中双击RowDataBound,生成如下事件:
Example:
protected void GridView1_RowDataBound(object sender,
GridViewRowEventArgs e)
{
//判断当前行是否是数据行
if (e.Row.RowType == DataControlRowType.DataRow)
{ //用FindControl方法找到模板中的Label控件
Label lb1= (Label)e.Row.FindControl("Label1");
//因为RowDataBound是发生在数据绑定之后,所以我们可以
//判断Label绑定的数据,如果是True,就更改其text属性为男
if (lb1.Text== "True")
lb1.Text = "男";
else
lb1.Text = "female";
}
}

14SQL数据库里两个‘一对多’的表绑到gridview里

比如:

表1
ID 姓名
1 张三
2 李四
3 王五

表2
RID 科目 分数
1 数学 87
1 语文 78
2 数学 67
2 语文 97

显示成
1 张三 数学87&语文78
2 李四 数学67&语文97

create table studentInfo
(
sIdint,
sNamevarchar(20)
)
insertinto studentInfo([sId],[sName])values(1,'张三')
insert into studentInfo([sId],[sName])values(2,'李四')
insert into studentInfo([sId],[sName])values(3,'王五')

select* from [studentInfo]

--drop table studentInfo

create table scoreInfo
(
rIdint,
pNamevarchar(20),
scoreint
)
insertinto scoreInfo([rId],[pName],[score])values(1,'数学',87)
insert into scoreInfo([rId],[pName],[score])values(1,'语文',78)
insert into scoreInfo([rId],[pName],[score])values(2,'数学',67)
insert into scoreInfo([rId],[pName],[score])values(2,'语文',97)

select* from scoreInfo
--drop tablescoreInfo


select[sId],[sName],(
select
'数学'+ltrim(str(isnull(sum(case[pName]when '数学'then [score]end),0)))
+'&语文'+ltrim(str(isnull(sum(case[pName]when '语文'then [score]end),0)))
GridView控件的一些总结(三) gridview控件的用法
from [scoreInfo] scwhere st.[sId]=sc.[rId])
from [studentInfo] st

1张三
2李四
3王五

1数学87
1语文78
2数学67
2语文97


1张三数学87&语文78
2李四数学67&语文97
3王五数学0&语文0

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/284014.html

更多阅读

的地得的用法 的和地的区别及用法

的地得的用法——简介日常工作中,常会有人提到“的”“地”“得”用法的问题,不少学生对“的、地、得”用法也是含糊不清,乱用一气,作业自然会在“的”“地”“得”用法上出错,并且屡改屡犯。大家都知道,“的”、“地”、“得”这三个字的

EXCEL表中LEFT和RIGHT函数的用法 left和right函数

在用EXCEL表中的时候,懂得一些常用的函数,会给你的工作带来很大便利。就像上次偶然的机会,听同事说道LEFT和RIGHT函数的用法,还挺有用的。像导出的财务数据,日期的格式都是2010-01-01,但是如果你只需要年月,不需要日期,你可以插入另外一列,适用

情态动词特殊用法大集合 情态动词的用法

情态动词特殊用法大集合情态动词除了基本的用法以外还有许多特殊之处,最基本的用法读者可以结合自己的语法书籍来适当复习,这儿就不赘述,主要略列一些特殊用法,希望对各位英语爱好者有所帮助。1. can和could⑴Can 和 could可以表示某

cisco ios 升级方法和TFTP的用法 cisco ap ios升级

cisco ios 升级方法和TFTP的用法升级方法:现总结归纳出CISCO路由器IOS映像升级的几种方法,供广大网络爱好者或同仁参考。在介绍CISCO路由器IOS升级方法前,有必要对Cisco路由器的存

as的用法总结 as的用法小结

as的用法总结as是英语考试中用得比较多的一个词,也是很多学生反映较难掌握的一个词。as的词性较多,用法也较复杂,因此掌握该词会对英语学习很有帮助。下面笔者就对as的用法作一个简单的归纳。一、as作为从属连词,可以引导下列从句:1、

声明:《GridView控件的一些总结三 gridview控件的用法》为网友未蓝澄海的烟分享!如侵犯到您的合法权益请联系我们删除