ASP.NET网页设计ASP.NET 2.0中的数据操纵::定制数据修正界面仓酷云
我认为,可以通过更加简单的首次编译,而增加第二次编译的负担,来提高net网页编程的运行效率。只是将net网页编程源代码进行简单的等价转换,而不假设编译成某种虚拟机器的目标格式,而由本地编译器针对性的二次编译。ScottMitchell2006年6月
Truly译
择要:本文次要先容怎样对GridView的编纂界面举行定制,使GridView在编纂时具有DropDownList和RadioButtonList控件,供应更人道化的界面。
译注:ScottMitchell写的46篇(如今公布了前15篇)ASP.NET2.0教程系列第20篇译文,原文还没有公布,Word文档能够在这里下载中英混排版本
目次
简介
1、重载UpdateProduct办法
2、手工处置可编纂的GridView
3、在编纂界面中利用DropDownList显现Category和Supplier
4、用RadioButton暗示Discontinued形态
小结
简介
GridView和DetailsView控件经由过程绑定列和CheckBox列,能够简化数据编纂界面制造,出现只读,编纂和新增界面,我们不必要增添元素标志或编写任何分外代码就能够失掉这些界面。但是,绑定列和CheckBox列出现的界面却缺少实践使用中常常用到的定制功效。为了对GridView和DetailsView的编纂、新增界面举行定制,必要用模板列(TemplateField)交换原有列。
在上节教程中我们会商怎样增添考证控件来定制数据编纂界面,而本节教程将演示怎样利用Web控件对实践的数据汇合举行定制:将绑定列和CheckBox列中默许的TextBox、CheckBox控件交换成其他的输出控件。为此,我们将创立一个可编纂的GridView,并同意编纂更新产物的名字、种别、供应商和放弃形态等。并且编纂某行时,种别category和供应商supplier我们将利用DropDownList来显现,以供用户举行选择。别的,还将CheckBox列中默许的CheckBox控件交换成RadioButtonList控件,并供应2个单选选项:Active和Discontinued。如:
<br>
:在GridView的编纂界面利用DropDownList和RadioButton控件
1、重载UpdateProduct办法
本节教程我们将创立一个可编纂的GridView并同意编纂更新产物的名字、种别、供应商和放弃形态等。因而,我们要重载UpdateProduct办法,并承受5个输出参数:4个产物参数值加上一个产物ID。像之前那样,本重载将:
1.依据指定的ProductID从数据库中猎取产物信息;
2.更新ProductName,categoryID,supplierID和Discontinued字段;
3.经由过程TableAdapter的Update()办法向数据会见层DAL收回更新哀求。
复杂起见,这个重载办法省略了一个主要的营业逻辑DD反省并确保一个将会标志为discontinued的产物不是它的供应商供应的独一产物。你乐意的话也能够加出去,大概做的更完美一些,将这个逻辑写到一个自力的办法中。
上面的代码是我们在ProductsBLL类中新增的UpdateProduct重载办法:
publicboolUpdateProduct(stringproductName,int?categoryID,int?supplierID,booldiscontinued,intproductID){Northwind.ProductsDataTableproducts=Adapter.GetProductByProductID(productID);if(products.Count==0)//假如没有婚配纪录,前往falsereturnfalse;Northwind.ProductsRowproduct=products;product.ProductName=productName;if(supplierID==null)product.SetSupplierIDNull();elseproduct.SupplierID=supplierID.Value;if(categoryID==null)product.SetCategoryIDNull();elseproduct.CategoryID=categoryID.Value;product.Discontinued=discontinued;//更新产物纪录introwsAffected=Adapter.Update(product);//乐成更新后前往true,不然前往falsereturnrowsAffected==1;}
2、手工处置可编纂的GridView
编写完UpdateProduct重载办法,上面要做的是创立可编纂的GridView:在计划器窗口中翻开EditInsertDelete文件夹中的CustomizedUI.aspx页,为其增添一个GridView控件;接着经由过程GridView的智能标志创立一个新的ObjectDataSource,设置这个ObjectDataSource利用ProductBLL类的GetProducts()办法来猎取产物信息,并让其利用下面创立的UpdateProduct重载办法来举行产物的更新。在新增和删除标签上,从下拉列表当选择(None)。
<br>
:设置ObjectDataSource利用下面创立的UpdateProduct重载办法像《datamodification》教程中那样,VisualStudio创立了ObjectDataSource的元素标志并指定OldValuesParameterFormatString属性为original_{0}。因为我们编写的办法不撑持传进的原始的ProductID值,以是营业逻辑层不会失效。因而,像上节教程中那样,我们必要从元素标志中移除这些属性,大概设置这些属性。
修改后的ObjectDataSource元素标志将以下所示:
<asp:ObjectDataSourceID="ObjectDataSource1"runat="server"SelectMethod="GetProducts"TypeName="ProductsBLL"UpdateMethod="UpdateProduct"><UpdateParameters><asp:ParameterName="productName"Type="String"/><asp:ParameterName="categoryID"Type="Int32"/><asp:ParameterName="supplierID"Type="Int32"/><asp:ParameterName="discontinued"Type="Boolean"/><asp:ParameterName="productID"Type="Int32"/></UpdateParameters></asp:ObjectDataSource>注重下面代码中OldValuesParameterFormatString已被移除,而且在UpdateParameters汇合中为UpdateProduct重载办法的每一个出口参数供应了一个Parameter。
固然ObjectDataSource被设置为只对产物的部分信息举行更新,而GridView却显现了一切的产物信息。我们必要依照上面几点来调剂GridView:
[*]1.只包含ProductName,SupplierName,CategoryName字段的绑定列和Discontinued字段的CheckBox列。
[*]2.CategoryName和SupplierName字段在Discontinued后面显现(右边)
[*]3.将CategoryName和SupplierName的题目分离改成“Category”和“Supplier”
[*]4.启用编纂形式(在GridView的智能标志当选择启用编纂复选框)
这些调剂以后,计划器中的页面将如所示:
<br>
:移除GridView中无用的字段
GridView的元素标志也像上面所示:
<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"DataKeyNames="ProductID"DataSourceID="ObjectDataSource1"EnableViewState="False"><Columns><asp:BoundFieldDataField="ProductName"HeaderText="ProductName"SortExpression="ProductName"/><asp:BoundFieldDataField="CategoryName"HeaderText="Category"ReadOnly="True"SortExpression="CategoryName"/><asp:BoundFieldDataField="SupplierName"HeaderText="Supplier"ReadOnly="True"SortExpression="SupplierName"/><asp:CheckBoxFieldDataField="Discontinued"HeaderText="Discontinued"SortExpression="Discontinued"/></Columns></asp:GridView>
这时候GridView的只读界面就改好了。检察数据时,每种产物就作为GridView中的一行,并显现产物的name,category,supplier和discontinued形态。
<br>
:GridView调剂后的只读界面
3、在编纂界面中利用DropDownList显现Category和Supplier
我们注重到ProductsRow对象包括产物的CategoryID,CategoryName,SupplierID和SupplierName属性,可是Products数据库只保留了外键,而对应的Name保留在Categories和Suppliers表中。ProductsRow对象中的CategoryID和SupplierID能够读取和写进,而CategoryName和SupplierName属性则标志为只读。
因为CategoryName和SupplierName的只读形态,响应绑定列的ReadOnly属性也被置为true,避免编纂某行时它们的值被修正。只管也能够经由过程设置ReadOnly属性为false,使其在编纂形态将这些绑定列转为TextBox,可是如许以来当用户实验更新产物信息时体系就会抛出非常,由于UpateProduct重载中其实不承受CategoryName和SupplierName参数。现实上,我们也不想编写这类重载办法,缘故原由以下:
[*]1.Products表没有SupplierName和CategoryName字段,而是对应的外键SupplierID和CategoryID。因而,我们但愿在更新办法中传送外键ID,而不是查找外键表中的值。
[*]2.请求用户键进supplier大概category的名字也很分歧理,由于这请求用户必需晓得正当的category和supplier,而且拼写准确无误。
我们盘算在只读形式Supplier和category列分离显现了分类和供应商的名字,而在编纂时,经由过程下拉列表显现可用选项。如许以来,用户能够疾速检察无效的category和supplier而且能够很便利直不雅的举行选择。
要完成这一点,必要将SupplierName和CategoryName对应的绑定列转换为模板列,在ItemTemplate模板中显现SupplierName和CategoryName,而EidtItemTemplate模板则利用DropDownList控件列出无效的cagegory和supplier。
增加Categories和Suppliers的DropDownList控件
我们要先将SupplierName和CategoryName绑定列转换为模板列:点击GridView智能标志中的‘编纂列’链接;选择左下的BoundField;点击“将此字段转换为TemplateField”链接,转换历程将创立一个模板列,包含ItemTemplate和EditItemTemplate,终极的元素标志大抵以下:
<asp:TemplateFieldHeaderText="Category"SortExpression="CategoryName"><EditItemTemplate><asp:LabelID="Label1"runat="server"Text="<%#Eval("CategoryName")%>"></asp:Label></EditItemTemplate><ItemTemplate><asp:LabelID="Label1"runat="server"Text="<%#Bind("CategoryName")%>"></asp:Label></ItemTemplate></asp:TemplateField>
因为绑定列标志为只读,ItemTemplate和EditItemTemplate都将用Label控件的Text属性绑定显现相干数据(如下面的CategoryName)。因而必要修正EditItemTemplate模板,用DropDownList控件来交换本来的Label控件。
像上节教程讲的,便可在计划器中编纂模板也可间接修正模板的元素标志。要在计划器中修正,能够经由过程GridView的智能标志点击“编纂模板”链接并选择Category字段的EditItemTemplate模板。删除Label控件用DropDownList控件取代,并设置DropDownList的ID属性为Categories。
<br>
:删除EditItemTemplate模板中的TextBox并增添一个DropDownList
下一步我们必要为DropDownList绑定category。从智能标志中点击“选择数据源”链接并选择创立一个新的ObjectDataSource,定名为CategoriesDataSource。
<br>
:创立一个新的ObjectDataSource控件CategoriesDataSource
为了使ObjectDataSource显现一切的category,我们将它与CategoriesBLL类的GetCategories()办法举行绑定。
<br>
:将ObjectDataSource控件用GategoriesBLL的GetCategories()办法举行绑定
最初,设置DropDownList,用CategoryName字段作为显现字段而CategoryID作为Value字段。
<br>
:用CategoryName作为显现字段并用CategoryID作为Value字段
修改后CategoryName的模板项将具有一个DropDownList控件和一个ObjectDataSource,元素标志大抵以下:
<asp:TemplateFieldHeaderText="Category"SortExpression="CategoryName"><EditItemTemplate><asp:DropDownListID="Categories"runat="server"DataSourceID="CategoriesDataSource"DataTextField="CategoryName"DataValueField="CategoryID"></asp:DropDownList><asp:ObjectDataSourceID="CategoriesDataSource"runat="server"OldValuesParameterFormatString="original_{0}"SelectMethod="GetCategories"TypeName="CategoriesBLL"></asp:ObjectDataSource></EditItemTemplate><ItemTemplate><asp:LabelID="Label1"runat="server"Text="<%#Bind("CategoryName")%>"></asp:Label></ItemTemplate></asp:TemplateField>
注重:EditItemTemplate模板中的DropDownList必需启用视图形态(viewstate)。上面我们将会在DropDownList的元素标志中增添数据绑定语法和数据绑天命令比方Eval()和Bind(),它们请求启用视图形态,不然将没法显现。
反复以上步骤为SupplierName的模板列中EditItemTemplate模板增加DropDownList控件,并定名为Suppliers。包含增添DropDownList控件和创立另外一个ObjectDataSource,注重新的ObjectDataSource挪用的是SuppliersBLL类的GetSuppliers()办法。别的,设置Suppliers下拉框的显现字段为CompanyName,value字段为SupplierID。
两个下拉框都增添完成后,在扫瞄器中检察页面并点击“ChefAnton’sCajunSeasoning”产物的编纂按钮。如所示,产物的category和supplier列都酿成了下拉框并包括了对应的category和supplier选项集。可是,你会发明下拉框中默许选择的是下拉框的第一项(category是Beverages,supplier是ExoticLiquids),现实上它们分离应当是Condiment和NewOrleansCajunDelights。
<br>
:下拉列表默许选中的是第一项
别的,假如点击更新,你会发明该产物的CategoryID和SupplierID都酿成了NULL。这些都是因为EditItemTemplate模板中的下拉框没有依据数据库中的实践数据举行绑定。
为DropDownList绑定CategoryID和SupplierID数据
为了使product编纂形态下的category和supplier下拉列表选中实践数据,并使其能够依据用户选择挪用BLL的UpdateProduct办法对数据库举行更新,我们必要对两个下拉框的SelectedValue分离绑定到CategoryID和SupplierID。比方关于Categories下拉框,我们间接在元素标志中增添SelectedValue="<%#Bind("CategoryID")%>"。
另外一种做法是在计划器中,经由过程下拉框的智能标志,点击“编纂DataBinding”链接,设置编纂模板中的下拉框的数据绑定。接上去,用两重形式指定SelectedValue绑定到CategoryID字段(见0)。反复下面的办法之一,为Suppliers下拉框绑定SupplierID数据。
<br>
0:给DropDownList的SelectedValue属性绑定CategoryID值
一旦完成两个下拉框SelectedValue属性的数据绑定,产物的category和supplier就会默许选中实践选项了。在点击Update按钮时,下拉框中的选择也会正确传送给UpdateProduct办法。1显现了增添数据绑定后的代码;注重怎样选中下拉列表中的项:ChefAnton’sCajunSeasoning产物的分类和供应商分离选中了准确的Condiment和NewOrleansCajunDelights选项。
<br>
1:修正后Categroy和Supplier准确选中了Product的实践数据
处置NULL值
Product表中的CategoryID和SupplierID列同意为NULL,而编纂模板中的下拉列表却没有NULL这一项。以是今朝存鄙人面两种成绩:
[*]1.用户没法则如今的界面中将某个product非空的category或supplier设置为NULL
[*]2.假如产物的CategoryID或SupplierID为NULL,在点击Edit按钮时程序会抛出非常。这是由于Bind()表达式中CategoryID(或SupplierID)前往NULL值时,SelectedValue没法找到NULL这一列表项因此抛出非常。
为了撑持CategoryID和SupplierID的NULL值,必要为两个DropDownList增添一个NULL值选项。在《Master/DetailFilteringWithaDropDownList》教程中,我们演示了为绑定的DropDownList增添列表项,办法是将DropDownList的AppendDataBoundItems属性设置为true并手动增添一个值为-1的列表项。在ASP.NET的数据绑定逻辑中,空字符串将主动转换为NULL,NULL值也能够转为空字符串。因而,本节教程我们将增添一个值为空字符串的列表项。
先将这两个DropDownList的AppendDataBoundItems属性设置为true。接着,用<asp:ListItem>元从来增添一个NULL列表项,元素标志大抵以下:
<asp:DropDownListID="Categories"runat="server"DataSourceID="CategoriesDataSource"DataTextField="CategoryName"DataValueField="CategoryID"SelectedValue="<%#Bind("CategoryID")%>"AppendDataBoundItems="True"><asp:ListItemValue="">(None)</asp:ListItem></asp:DropDownList>我们选择了利用“(None)”作为列表项的文本显现(Text),你也能够空字符串或其余字符。
注重:《Master/DetailFilteringWithaDropDownList》教程演示过DropDownList列表项的增添办法DD在计划器中点击DropDownList的属性窗口(F4)中的Item属性(将显现ListItem汇合编纂器)。此次我们接纳间接在元素标志中增添NULL列表项。假如你利用汇合编纂器,创立出的元素标志将疏忽空字符的Value,如:<asp:ListItem>(None)</asp:ListItem>。看起来并没有年夜碍,但是DropDownList对没有Value的项则利用Text来取代,如许以来选择“None”时,“None”则被付与CategoryID,体系将发生非常。经由过程显式设置Value="",选择此项,CategoryID就被更新为NULL值了。
反复以上步骤设置Supplier的下拉框控件。
经由过程这一附加的列表项,编纂界面就能够为Product的CategoryID和SupplierID设定NULL值了,见2
<br>
2:经由过程选择(None)为产物的Category或Supplier指定NULL值。
4、用RadioButton暗示Discontinued形态
Product的Discontinued字段以CheckBox列出现,只读形式是disabled的,只要编纂形式下才被enable。依据配套必要,我们可使用模板列对其举行定制。本节教程中,我们将利用含有RadioButtonList控件的模板列取代本来的CheckBox列,并带有两个选项-“Active”和“Discontinued”–让用户选择product的Discontinued值。
先将Discontinued的CheckBox列转为模板列,会用到ItemTemplate和EditItemTemplate两个模板。它们利用CheckBox并将经由过程Checked属性绑定Discontinued字段,独一的区分在于ItemTemplate模板中的CheckBox的Enabled属性是false。
利用RadioButtonList控件交换失落本来ItemTemplate和EditItemTemplate模板中的CheckBox控件,并将它们的ID属性都设置为DiscontinuedChoice。然后,设置RadioButtonLists的两个单选按钮项,一个为“Active”标签,值为“False”,另外一个为“Discontinued”标签,值为“True”。这些操纵便可间接在元素标志中增加<asp:ListItem>元素,也可经由过程计划器中ListItem汇合编纂器处置。3演示了指定两个单选按钮后的ListItem汇合编纂器。
<br>
3:为RadioButtonList增添Active和Discontinued选项
因为一般项模板ItemTemplate中的RadioButtonList不该是编纂形态,以是设置Enabled属性为false,而编纂形态对应的EditItemTemplate模板中RadioButtonList的Enabled属性则应设置为true。如许以来,非编纂行中单选按钮作为只读显现,而编纂形态则同意用户举行选择。
仍旧必要用数据库中product的Discontinued数据绑定RadioButtonList控件的SelectedValue属性。像本节教程后面那样,便可间接增加绑定语法也可经由过程RadioButtonList的智能标志中的‘编纂DataBinding’链接。
增添完这两个RadioButtonList并做得当设置后,Discontinued的模板列元素标志大抵以下:
<asp:TemplateFieldHeaderText="Discontinued"SortExpression="Discontinued"><ItemTemplate><asp:RadioButtonListID="DiscontinuedChoice"runat="server"Enabled="False"SelectedValue="<%#Bind("Discontinued")%>"><asp:ListItemValue="False">Active</asp:ListItem><asp:ListItemValue="True">Discontinued</asp:ListItem></asp:RadioButtonList></ItemTemplate><EditItemTemplate><asp:RadioButtonListID="DiscontinuedChoice"runat="server"SelectedValue="<%#Bind("Discontinued")%>"><asp:ListItemValue="False">Active</asp:ListItem><asp:ListItemValue="True">Discontinued</asp:ListItem></asp:RadioButtonList></EditItemTemplate></asp:TemplateField>此时,Discontinued列从CheckBox列变化为一对单选按钮(见4)。当进进product编纂界面时,discontinued对应的单选按钮被选中,点击更新时也会将新的形态更新到数据库。
4:暗示Discontinued的CheckBox被交换成一对单选按钮
注重:因为Product数据库中的Discontinued字段不同意为NULL值,以是显现界面中不必思索NULL的情形。不外假如Discontinued同意NULL时,就要在列表中增添第3个单选项,值设为空字符串(Value=””),就像category和supplier的下拉框那样。
小结
因为绑定列和CheckBox列主动出现了只读、编纂和新增界面,短少定制才能。但是我们却常常必要对新增和编纂界面举行定制,好比增添考证控件(上节教程)或定制数据集的用户界面(本节教程)。用模板列TemplateField定制界面总结为以下几步:
1.增添模板列大概将现有的绑定列、CheckBox列转为模板列。
2.依照实践必要给界面增添控件
3.给新增添的控件举行相干字段的数据绑定。
定制历程除利用内建的ASP.NET控件,也能够在模板列中利用自界说控件,编译过的服务器控件和用户控件。
祝编程康乐!
作者简介
ScottMitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的开创人,自1998年以来一向使用微软Web手艺。Scott是个自力的手艺征询参谋,培训师,作家,比来完成了将由Sams出书社出书的新作,《24小时内精晓ASP.NET2.0》(英文)。他的接洽电邮为mitchell@4guysfromrolla.com,也能够经由过程他的博客http://ScottOnWriting.NET与他接洽。
一般的指的.net就是跟net网页编程相对的那种,主要是做企业级应用的。你如果想学这个,主要就是学C#和数据库。(ASP.NET好像很重要的,应该也要学的,ASP.NET上好像可以结合VB和C#等多种语言,但是微软主推C#) 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。 通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 代码的可重用性差:由于是面向结构的编程方式,并且混合html,所以可能页面原型修改一点,整个程序都需要修改,更别提代码重用了。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。 逐步缩小出错代码段的范围,最终确定错误代码的位置。 ASP.NET:ASP.net是Microsoft.net的一部分,作为战略产品,不仅仅是ActiveServerPage(ASP)的下一个版本;它还提供了一个统一的Web开发模型,其中包括开发人员生成企业级Web应用程序所需的各种服务。ASP.NET的语法在很大程度上与ASP兼容,同时它还提供一种新的编程模型和结构,可生成伸缩性和稳定性更好的应用程序,并提供更好的安全保护。 有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。 但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。 现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。 那么,ASP.Net有哪些改进呢? asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源 当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
页:
[1]