辰迅云帮助中心

其他类

ASP.NET 2.0中怎么创建一个自定义排序用户界面,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。步骤1:创建一个普通的,能够排序的GridView  在我们学习如何创建增强型排序用户界面之前,先创建一个普通的列出所有产品GridView并且能够排序.现在打PagingAndSorting文件夹下的CustomSortingUI.aspx,添加一个GridView,设置ID="ProductList",以一个ObjectDataSource为数据源,ObjectDataSource的数据从ProductsBLL类的GetProducts()取得。  接下来设置GridView的列,包括ProductName, CategoryName, SupplierName, UnitPrice绑定列和Discontinued复选框列,再设置GridView允许排序。设置完这些以后你应该可以在代码编辑看到下面这些代码:<asp:GridView ID="ProductList" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <Columns>  <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" />  <asp:BoundField DataField="CategoryName" HeaderText="Category" ReadOnly="True" SortExpression="CategoryName" />  <asp:BoundField DataField="SupplierName" HeaderText="Supplier" ReadOnly="True" SortExpression="SupplierName" />  <asp:BoundField DataField="UnitPrice" DataFormatString="{0:C}" HeaderText="Price"   HtmlEncode="False" SortExpression="UnitPrice" />  <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" /> </Columns></asp:GridView><asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL"></asp:ObjectDataSource>这时你在浏览器中预览你将看到类似图2的界面,数据按类别的字母顺序排序.图2:可排序GridView按Category按序步骤2:如何添加分界行  完成创建创建一个普通的,能够排序的GridView后,就要在每一个类别的第一行之前添加分界行。怎么把这些分界行添加进GridView呢?一开始我们会想到遍历GridView的所有行,遇到排序列中的值不同就插入分界行。按照这种想法我们自然倒想利用GridView的DataRowBound事件来实现,DataRowBound事件我们已经在基于数据的自定义格式化一章中讲过,DataRowBound事件通常应用于格式化数据行。但是,DataRowBound事件不能解决这个问题,因为不能用这个事件动态地添加行到GridView,GridView的Rows集合是只读的.  要添加行到GridView有以下3个方法:  添加分界行到GridView绑定的数据源中  GridView绑定数据后,添加额外的TableRow对象到GridView的控件集  创建一个自定义服务器控件,扩展GridView控件,重写它的方法以重新构造GridView的结构  如果自定义排序用户界面广泛应用多个页面或多个网站,创建一个自定义服务器控件是最好的方法.但采用这种方法要写太多的代码并且要深入理解GridView控件的的内部原理。因此,我们在这篇文章中不考虑使用这种方法。另外两种不同的方法-添加分界行到GridView绑定的数据源中和在GridView绑定数据后操作它的子控件,值得讨论.添加分界行到绑定GridView的数据源中  当GridView被绑定到数据源,GridView从数据源中的每一条记录创建一条GridViewRow.因此我们可以在数据绑定(binding)之前添加一条"分界记录",图3描述了这个过程.图3:添加分界行到数据源原理图  "分界记录"这个术语之所以加引号是因为实际没有这条特殊的记录,我们只是在数据源中添加一些标记行。打个比方,绑定ProductsDataTable对象到GridView,ProductsDataTable由ProductRow组成。我们可以标记一条记录作为"分界记录"并且设置CategoryID为-1(因为-1不存在普通记录中).使用这种方法要以下的步骤实现:1.得到绑定到GirdView的数据(一个ProductsDataTable对象)2.基于GridView的SortExpression和SortDirection属性排列数据3.遍历ProductsDataTable中的ProductsRows,寻找排序列的分界。4.在每组的分界处插入"分界行"ProductsRow到DataTable中,CategoryID列值为-1(或其它可以标记"分界行"的值).5.插入"分界行"后动态地绑定数据到GridView.  完成以上5个步骤,还要在RowDataBound事件中判断哪些行是"分界行"(CategoryID=-1的行),格式化"分界行"的显示样式.此外还要再做一些工作,在Sorting事件中保留SortExpressiont和SortDirection的值.GridView绑定数据后,添加额外的TableRow对象到GridView的控件集  相比在GridView绑定数据之前,在GridView绑定数据之后添加"分界行"更胜一筹.GridView是由一个Table构成,一个Table由Rows集构成,一个Row由Cells集构成,这就是GridView的控件层次.GridView根部是Table对象,再由数据源的每条记录生成GridViewRow (由TableRow派生出来),数据源的每一格的值又在GridViewRow生成TableCell.我们可以利用GridView的控件层次构成以后在每组之间的添加分界行.因为GridView的控件层次结构是在页面呈现的时候创建的,所以重写Page类的Render方法,在需要的地方加上分界行,图4描述了这个过程.图4:更改GridView控件层次结构添加界行原理图这篇文章将用最后一个方法创建自定义排序用户界面.注意:这里使用的代码是基于Teemu Keiski Blog中的Playing a Bit with GridView Sort Grouping一文.步骤3:添加分界行到GridView的控件层次结构中我们要在GridView的控件层次已经构造完毕后,以及在页面呈现之前添加分界行,必须在页面生命周期的最后阶段但又必须在GridView生成HTML语言之前进行,因此要重写Page类的Render方法,比如在下面的代码:protected override void Render(HtmlTextWriter writer){  // Add code to manipulate the GridView control hierarchy base.Render(writer); }  当页面的原来的Render方法(base.Render(writer))被调用,页面的每个控件将被显示出来,产生出来的HTML标记基于控件层次.因此我们势必要在base.Render(writer)被调用之前更改GridView的控件层次结构.要添加分界行必须确保用户已经排好序,但刚开始GridView是没有按类别排好序的,不必要添加分界行.  注意:如果要使GridView默认是按某一列排序的,就要在Page_Load中调用GridView的Sort方法,注意要在if(!IsPostBack)中.请参考分页和排序数据(Paging and Sorting Report Data)一章获得关Sort方法的更多相关知识.假设已经完成排序,下面要做的是判断是按哪一列排序并寻找该列不同组的分界处,下面的代码判断是否排序,按哪一列排序:protected override void Render(HtmlTextWriter writer){  // Only add the sorting UI if the GridView is sorted if (!string.IsNullOrEmpty(ProductList.SortExpression))  {   // Determine the index and HeaderText of the column that   //the data is sorted by  int sortColumnIndex = -1;   string sortColumnHeaderText = string.Empty;   for (int i = 0; i < ProductList.Columns.Count; i++)   {    if (ProductList.Columns[i].SortExpression.CompareTo(ProductList.SortExpression) == 0)    {     sortColumnIndex = i;     sortColumnHeaderText = ProductList.Columns[i].HeaderText;     break;    }   }   // TODO: Scan the rows for differences in the sorted column's values}  假如GridView没有排序,SortExpression就没有设置值.我们要做的是对已经排序的GridView添加分界行.完成排序后,下一步要判断是按第几列排序,遍历每一列,比较SortExpression和哪一列的HeaderText相同,用两个变量sortColumnIndext和sortColumnHeaderText分别保存该列的索引和标题.  知道是按第几列排序后,最后一步是添加分界行到GridView中,遍历排序列的每一行,比较每上一行的值和它的当前行的值相不相同,不相同就要在中间插入分界行,代码如下:protected override void Render(HtmlTextWriter writer){  // Only add the sorting UI if the GridView is sorted if (!string.IsNullOrEmpty(ProductList.SortExpression))  {   // ... Code for finding the sorted column index removed for brevity ...     // Reference the Table the GridView has been rendered into  Table gridTable = (Table)ProductList.Controls[0];   // Enumerate each TableRow, adding a sorting UI header if  // the sorted value has changed  string lastValue = string.Empty;   foreach (GridViewRow gvr in ProductList.Rows)   {    string currentValue = gvr.Cells[sortColumnIndex].Text;    if (lastValue.CompareTo(currentValue) != 0)    {     // there's been a change in value in the sorted column    int rowIndex = gridTable.Rows.GetRowIndex(gvr);     // Add a new sort header row    GridViewRow sortRow = new GridViewRow(rowIndex, rowIndex, DataControlRowType.DataRow, DataControlRowState.Normal);     TableCell sortCell = new TableCell();     sortCell.ColumnSpan = ProductList.Columns.Count;     sortCell.Text = string.Format("{0}: {1}", sortColumnHeaderText, currentValue);     sortCell.CssClass = "SortHeaderRowStyle";     // Add sortCell to sortRow, and sortRow to gridTable    sortRow.Cells.Add(sortCell);     gridTable.Controls.AddAt(rowIndex, sortRow);          // Update lastValue    lastValue = currentValue;    }   }  }  base.Render(writer); }  首先获得GridView控件层次结构的根控件,一个Table,用gridTable表示.另外用字符串变量lastValue表示上一行的值,currentValue表示当前行的值.  注意:我获得通过单元格(cell)的Text属性赋值给lastValue和currentValue,这只能应用的绑定列(BoundFields),对于其它种类的列如模板列(TemplateField),复选框列(CheckBoxField)等等是不可行的,我将会在后面说明如何解决非绑定列的取值问题.  比较lastValue和currentValue,如果不同就要添加分界行到GridView的控件层次结构中.取得当前行的索引,创建一个GridViewRow对象(它由TableCell组成)插入到GridView的控件层次结构中.另外我们要把分界行格式化成单独的一个单元格,宽度与GridView相同,样式与应用SortHeaderRowStyle样式(css文件在下面给出),显示的文字是排序列名(如Category)和组名(如SeaFood),最后把currentValue赋值给lastValue.下面给出css代码:.SortHeaderRowStyle{  background-color: #c00;  text-align: left;  font-weight: bold;  color: White; }  完成上面的代码后,就可以对按绑定列排序后生成有分界行的排序界面(图5是按supplier排序后给出的截图).但是我现在还不能对其它种类的列(如模板列或者复选框列)生成用户定义排序界面,如图6所示(按Discontinue排序).图5:绑定列排序图6:按ChectBox列排序没有出现分界行  按复选框列排序没有出现分界行是的原因是代码通过获取TableCell的Text属性判断按哪一列排序的,但复选框列TableCell的Text是空的,我们要从TableCell包含的控件取得CheckBox控件.遇到这种类型的列,要判断CheckBox有没有打勾,把currentValue = gvr.Cells[sortColumnIndex].Text替换成以下代码:string currentValue = string.Empty;if (gvr.Cells[sortColumnIndex].Controls.Count > 0) {  if (gvr.Cells[sortColumnIndex].Controls[0] is CheckBox)  {   if (((CheckBox)gvr.Cells[sortColumnIndex].Controls[0]).Checked)    currentValue = "Yes";   else   currentValue = "No";  }  // ... Add other checks here if using columns with other //  Web controls in them (Calendars, DropDownLists, etc.) ...}else currentValue = gvr.Cells[sortColumnIndex].Text;  这段代码判断有没有控件存在排序列的TableCell中,如果有并且第一个控件是CheckBox,按照CheckBox的Checked属性给currentValue赋值为"Yes"或者"NO",要是绑定就把TableCell的Text属性值赋给currentValue.同样道理,模板列使用此方法.图7是完善代码按Discontinue排序后的截图.关于ASP.NET 2.0中怎么创建一个自定义排序用户界面问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注辰讯云资讯频道了解更多相关知识。...

ASP.NET 2.0中怎么利用DataList和Repeater显示数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步 1: 添加DataList 和Repeater 教程页  在开始本篇教程前,我们首先花点时间来创建一些页,这些页会在本篇和后面的几篇教程里用到.先添加一个名为DataListRepeaterBasics的文件夹,然后,添加下面的页,添加页的时候确保每页都选择了 Site.master作为母板页:Default.aspxBasics.aspxFormatting.aspxRepeatColumnAndDirection.aspxNestedControls.aspx图 1: 创建 DataListRepeaterBasics 文件夹 和添加页  打开Default.aspx页的设计视图,从UserControls文件夹将SectionLevelTutorialListing.ascx用户控件拖进来.这个用户控件提供的功能就是列出教程章节.我们在母板页和站点导航里创建的它.图 2: 添加SectionLevelTutorialListing.ascx 用户控件到Default.aspx最后,将这些页的地址加到 Web.sitemap 的条目里.在Paging and Sorting <siteMapNode>之后添加下面的标记.<siteMapNode title="Displaying Data with the DataList and Repeater" description="Samples of Reports that Use the DataList and Repeater Controls" url="~/DataListRepeaterBasics/Default.aspx" > <siteMapNode title="Basic Examples" description="Examines the basics for displaying data using the    DataList and Repeater controls." url="~/DataListRepeaterBasics/Basics.aspx" /> <siteMapNode title="Formatting" description="Learn how to format the DataList and the Web controls within    the DataList and Repeater's templates." url="~/DataListRepeaterBasics/Formatting.aspx" /> <siteMapNode title="Adjusting the DataList s Layout" description="Illustrates how to alter the DataList's layout, showing    multiple data source records per table row." url="~/DataListRepeaterBasics/RepeatColumnAndDirection.aspx" /> <siteMapNode title="Nesting a Repeater within a DataList" description="Learn how to nest a Repeater within the template of a DataList." url="~/DataListRepeaterBasics/NestedControls.aspx" /></siteMapNode>图 3: 向 Site Map 里添加新的页第二步: 在 DataList里显示Product信息  和FormView一样,DataList 使用模板来显示信息,而非BoundFields, CheckBoxFields等.而与FormView不同的是,DataList 是被用来显示一组记录,而不是单独的一条.现在我们开始本章的教程.首先看看如何将product 绑定到DataList.打开DataListRepeaterBasics 文件夹里的Basics.aspx 页,然后从工具箱里拖一个DataList 进来.如图4所示,在指定模板前,设计器会是灰色的.图 4: 从工具箱拖一个DataList到设计器里  打开DataList的智能标签,添加一个ObjectDataSource ,使用ProductsBLL 类的GetProducts 方法来配置它.因为在本教程里创建的DataList 为只读的,因此在INSERT, UPDATE, 和DELETE 标签的下拉列表里都选择None.图 5: 创建一个新的ObjectDataSource图 6: 用ProductsBLL 类来配置ObjectDataSource图 7: 使用GetProducts 方法来获取所有Product的信息  通过智能标签里配置完ObjectDataSource ,并把它和DataList 关联起来后,Visual Studio会在DataList 里自动为数据源返回的每个字段创建一个ItemTemplate 用来显示name 和value (见下面的代码).这个默认的ItemTemplate看起来和绑定FormView 时自动产生的模板是一样的.<asp:DataList ID="DataList1" runat="server" DataKeyField="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <ItemTemplate> ProductID: <asp:Label ID="ProductIDLabel" runat="server"    Text='<%# Eval("ProductID") %>' /><br /> ProductName: <asp:Label ID="ProductNameLabel" runat="server"    Text='<%# Eval("ProductName") %>' /><br /> SupplierID: <asp:Label ID="SupplierIDLabel" runat="server"    Text='<%# Eval("SupplierID") %>' /><br /> CategoryID: <asp:Label ID="CategoryIDLabel" runat="server"    Text='<%# Eval("CategoryID") %>'/><br /> QuantityPerUnit: <asp:Label ID="QuantityPerUnitLabel" runat="server"    Text='<%# Eval("QuantityPerUnit") %>' /><br /> UnitPrice: <asp:Label ID="UnitPriceLabel" runat="server"    Text='<%# Eval("UnitPrice") %>' /><br /> UnitsInStock: <asp:Label ID="UnitsInStockLabel" runat="server"    Text='<%# Eval("UnitsInStock") %>' /><br /> UnitsOnOrder: <asp:Label ID="UnitsOnOrderLabel" runat="server"    Text='<%# Eval("UnitsOnOrder") %>' /><br /> ReorderLevel: <asp:Label ID="ReorderLevelLabel" runat="server"    Text='<%# Eval("ReorderLevel") %>' /><br /> Discontinued: <asp:Label ID="DiscontinuedLabel" runat="server"    Text='<%# Eval("Discontinued") %>' /><br /> CategoryName: <asp:Label ID="CategoryNameLabel" runat="server"    Text='<%# Eval("CategoryName") %>' /><br /> SupplierName: <asp:Label ID="SupplierNameLabel" runat="server"    Text='<%# Eval("SupplierName") %>' /><br /> <br /> </ItemTemplate></asp:DataList><asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" TypeName="ProductsBLL"></asp:ObjectDataSource>  注意:当通过智能标签将数据源绑定到FormView 时,Vistual Studio会创建一个ItemTemplate,一个InsertItemTemplate和一个EditItemTemplate.然而对DataList来说,只会创建一个ItemTemplate .这是因为DataList 不象FormView那样,有内置的编辑和插入功能.DataList 没有编辑和删除相关的事件,虽然要完成这些功能,对DataList 来说没有FormView那么简单,我们仍然可以加少量代码来实现它.我们在以后的教程里会讲到如何在DataList 里完成编辑和删除的功能.  让我们花点时间来改善一下模板的外观.我们只显示product的name,supplier,category,数量和单价.而且我们用<h5> 来显示名字,其它字段都放在 <h5>heading下的<table>里.你可以通过DataList的只能标签里的 Edit Templates ,或者直接修改页面声明语法来达到以上目的.如果你是通过Edit Templates 来实现,那你的页面代码可能和下面的不完全一样.但是通过浏览器浏览你的页面应该和图8看起来差不多.<asp:DataList ID="DataList1" runat="server" DataKeyField="ProductID" DataSourceID="ObjectDataSource1" EnableViewState="False"> <ItemTemplate> <h5><asp:Label ID="ProductNameLabel" runat="server"  Text='<%# Eval("ProductName") %>' /></h5> <table border="0">  <tr>  <td class="ProductPropertyLabel">Category:</td>  <td><asp:Label ID="CategoryNameLabel" runat="server"   Text='<%# Eval("CategoryName") %>' /></td>  <td class="ProductPropertyLabel">Supplier:</td>  <td><asp:Label ID="SupplierNameLabel" runat="server"   Text='<%# Eval("SupplierName") %>' /></td>  </tr>  <tr>  <td class="ProductPropertyLabel">Qty/Unit:</td>  <td><asp:Label ID="QuantityPerUnitLabel" runat="server"   Text='<%# Eval("QuantityPerUnit") %>' /></td>  <td class="ProductPropertyLabel">Price:</td>  <td><asp:Label ID="UnitPriceLabel" runat="server"   Text='<%# Eval("UnitPrice", "{0:C}") %>' /></td>  </tr> </table> </ItemTemplate></asp:DataList>  注意:上面的例子使用的是Text指定为数据绑定的值的Label控件.我们也可以不使用Label,而只是保留数据绑定的代码.也就是说,我们可以用<%# Eval("CategoryName") %>来代替<asp:Label ID="CategoryNameLabel" runat="server" Text='<%# Eval("CategoryName") %>' />.  使用Label控件有两个好处,第一点在下一章我们会看到,就是提供了一个格式化数据的简单途径.第二点是不使用web控件的时候,Edit Templates 不显示声明的数据绑定代码.通过Edit Templates 的界面很容易操作静态标记语言和web控件,其前提是所有的数据绑定都是通过web控件的智能标签里的Edit DataBindings对话框来实现.因此,使用DataList的时候,我建议使用Label控件,这样通过Edit Templates 就可以操作其内容.我们会看到,使用Repeater 时如果需要编辑其内容,需要切换到源视图.而设计Repeater模板的时候,我通常不使用Label控件,除非我需要格式化绑定数据的外观.图 8:  用DataList的 ItemTemplate显示Product第三步: 改善DataList的外观  和GridView一样,DataList 提供了一些和风格有关的属性,比如Font, ForeColor, BackColor, CssClass, ItemStyle, AlternatingItemStyle, SelectedItemStyle等.当使用 GridView 和DetailsView 时,我们首先在DataWebControls Theme里创建了一些皮肤文件,这些文件预定义了这两个控件的CssClass 属性和RowStyle, HeaderStyle等.我们使用DataList的时候也采取这种方法.  象在使用ObjectDataSource展现数据 里谈到的那样,一个Skin 文件定义了一个web控件的默认显示属性.一个Theme 是一组Skin, CSS, image, 和JavaScript files 的集合,它定义了一个web站点的外观.在使用ObjectDataSource展现数据 那一章里,我们创建了一个DataWebControls  Theme(App_Themes 文件夹下) ,它包含两个Skin文件- GridView.skin 和DetailsView.skin.我们现在来为DataList添加第三个.右键单击App_Themes/DataWebControls 文件夹,选择Add a New Item,选择Skin File,在名字里填DataList.skin.图 9: 创建一个名为DataList.skin的Skin文件将下面的标记语言添加到DataList.skin里.<asp:DataList runat="server" CssClass="DataWebControlStyle"> <AlternatingItemStyle CssClass="AlternatingRowStyle" /> <ItemStyle CssClass="RowStyle" /> <HeaderStyle CssClass="HeaderStyle" /> <FooterStyle CssClass="FooterStyle" /> <SelectedItemStyle CssClass="SelectedRowStyle" /></asp:DataList>  上面用GridView 和DetailsView 使用的CSS文件设置DataList .在DataWebControlStyle, AlternatingRowStyle, RowStyle里用到的CSS文件是在Styles.css 里定义的.  添加完Skin后,DataList的外观看起来会变了(你可以在视图菜单里选择刷新来看改变后的效果).见图10,alternating product 的背景色为粉红色.图 10: 添加skin文件后的效果第四步: 浏览DataList的其它TemplatesDataList 还支持除了ItemTemplate外的其它6种template:HeaderTemplate — 用来呈现 header rowAlternatingItemTemplate — 用来呈现alternating itemsSelectedItemTemplate — 用来呈现selected item; selected item 的index 可以通过DataList 的 SelectedIndex property 得到EditItemTemplate — 用来呈现被编辑的item SeparatorTemplate — 用来分隔各个itemFooterTemplate - 用来呈现footer row  当指定HeaderTemplate 或FooterTemplate时,DataList 会加一个header 或footer .和GridView一样,DataList 的header 和footer 没有和数据绑定在一起.  注意:如我们在在GridView的页脚中显示统计信息 一章里看到的那样,header 和footer 不支持数据绑定语法,而数据绑定的信息可以通过GridView的RowDataBound event handler来写.这个技术可以用来技术绑定的数据的和或其它信息,并在footer里显示.同样的,可以在DataList 和Repeater 里面这样做.它们唯一的区别在于对DataList 和Repeater 来说是为ItemDataBound 创建event handler (而不是RowDataBound ).  在我们的例子里,我们将标题“Product Information”用<h4> 显示在DataList的results 的顶部.为了达到这个目的,在HeaderTemplate 中添加合适的标记语言.或者通过DataList的智能标签中的Edit Templates 来实现.从下拉列表中选择Header Template ,从style 下拉列表中选择Heading 3 并输入Text(见图11).图 11: 添加Text 为“Product Information”的HeaderTemplate同样,直接在<asp:DataList>标记里加入以下代码也可以达到上面的目的.<HeaderTemplate> <h4>Product Information</h4></HeaderTemplate>为了在每个列出的product 之间保留一些空间,我们现在来添加一个SeparatorTemplate .<hr>标签可以完成这种分割的功能.见下面的标记语言<SeparatorTemplate> <hr /></SeparatorTemplate>注意:与HeaderTemplate 和FooterTemplates一样,SeparatorTemplate 并不和数据源里的任何数据绑定.因此,并不能直接的和DataList绑定的数据发生关系.现在在浏览器里浏览这个页面,看起来应该和图12差不多.注意header 和各个product 之间的线.图 12: DataList 现在包含了 Header Row 和每个Product 之间有一条线第五步: 使用Repeater  在浏览图12的例子时,你可以看看页面的源文件.你会看到DataList 包含有<tr>和<td>标记的HTML<table>.这个实际上和GridView一样.我们会在将来的教程里看到,DataList允许每一行显示多条记录.  但如果你不想使用HTML<table>呢?我们将使用Repeater .Repeater 也是基于templates构建的.它提供以下5种template:HeaderTemplate — 在items前加指定的标记ItemTemplate — 用来呈现itemsAlternatingItemTemplate — 用来呈现alternating itemsSeparatorTemplate —在各个item 之间加指定的标记FooterTemplate - 在items后加指定的标记  在ASP.NET  1.x版本里.Repeater 通常用来显示一些数据列.在这种情况下,HeaderTemplate 和FooterTemplates 包含一对<ul>标记,而ItemTemplate 包含 <li> 和数据绑定语法.这种方法在ASP.NET 2.0也适用,比如我们在母板页和站点导航一章里看到的例子:  在Site.master母板页里,  Repeater 用来显示顶级站点内容(Basic Reporting, Filtering Reports, Customized Formatting, and so on); 嵌套的Repeater 用来显示 子区域的内容.在SectionLevelTutorialListing.ascx用户控件里, Repeater 用来显示当前站点区域的子区域内容.  注意:ASP.NET 2.0可以使用BulletedList control.使用它的时候不需要指定任何和list有关的HTML.而仅仅是指定每个list item的字段.  Repeater 是一个"全能"的控件,如果你找不到控件可以产生需要的标记语言,那么可以使用Repeater .我们来举例说明,在第二步里创建的显示Product信息的DataList上显示出categoried.我们将每个categorie作为一列显示在单行的HTML<table>里.从工具箱里拖一个Repeater 到显示Product 的DataList上.和DataList一样,在定义templates前,Repeater 是灰色的.图 13: 添加一个 Repeater 控件在Repeater 的智能标签里只有一个可选项:选择数据源.创建一个ObjectDataSource ,用CategoriesBLL 类的GetCategories 方法配置它.图 14: 创建ObjectDataSource图 15: 用 CategoriesBLL 类配置ObjectDataSource图16: 用 GetCategories Method获取所有Categories的信息和DataList不一样,在绑定到数据源后,Visual Studio不会为Repeater 自动创建ItemTemplate .而且Repeater 的templates 不能通过设计器来配置,只能写页面代码.我们用如下标记来将每个category作为一列显示在单行的<table>里:<table> <tr>  <td>Category 1</td>  <td>Category 2</td>  ...   <td>Category N</td> </tr></table>  由于<td>Category X</td>是重复的一部分,因此会显示在Repeater的ItemTemplate里.在它之前的标记<table><tr>会放在HeaderTemplate里,而结束标记</tr></table>会放在FooterTemplate里.在设计器的左下角点源视图按钮进入ASP.NET页的声明代码部分,输入以下代码:<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource2" EnableViewState="False"> <HeaderTemplate>  <table>   <tr> </HeaderTemplate> <ItemTemplate>    <td><%# Eval("CategoryName") %></td> </ItemTemplate> <FooterTemplate>   </tr>  </table> </FooterTemplate></asp:Repeater>Repeater 精确的包含在它模板里指定的标记,不会有任何多余的部分.图17显示通过浏览器浏览Repeater的样子.图 17: 在单行的HTML <table> 用单独的列列出每个Category第六步: 改善Repeater的外观  既然Repeater 是精确呈现在templates里指定的标记,那么你应该可以想到它不包含任何和风格有关的属性.为了改变Repeater产生的内容的外观,我们需要手动的将HTML或CSS加到它的templates里.  在这个例子里,我们将做一个类似DataList的alternating rows那样的东西,改变category 的背景色.我们通过ItemTemplate 和AlternatingItemTemplate 来为每个Repeater item 指定RowStyle CSS class ,为每个alternating Repeater item 指定AlternatingRowStyle CSS class ,象下面的代码一样:<ItemTemplate> <td class="RowStyle"><%# Eval("CategoryName") %></td></ItemTemplate><AlternatingItemTemplate> <td class="AlternatingRowStyle"><%# Eval("CategoryName") %></td></AlternatingItemTemplate>  我们还要添加一个text为“Product Categories”的header .由于我们不知道 <table>会由多少列组成,最简单的方法保证产生的header 可以跨越所有的列是使用两个<table>.第一个<table>包含两行 — header 和一行包含第二个 <table>的行.第二个 <table>里每个category 为一列.<table> <tr>  <th>Product Categories</th> </tr> <tr>  <td>   <table>   <tr>    <td>Category 1</td>    <td>Category 2</td>    ...     <td>Category N</td>   </tr>   </table>  </td> </tr></table>下面的 HeaderTemplate 和FooterTemplate 产生需要的标记:<asp:Repeater ID="Repeater1" runat="server" DataSourceID="ObjectDataSource2" EnableViewState="False"> <HeaderTemplate>  <table cellpadding="0" cellspacing="0">   <tr>    <th class="HeaderStyle">Product Categories</th>   </tr>   <tr>    <td>     <table cellpadding="4" cellspacing="0">      <tr> </HeaderTemplate> <ItemTemplate>       <td class="RowStyle"><%# Eval("CategoryName") %></td> </ItemTemplate> <AlternatingItemTemplate>       <td class="AlternatingRowStyle">        <%# Eval("CategoryName") %></td> </AlternatingItemTemplate> <FooterTemplate>      </tr>     </table>    </td>   </tr>  </table> </FooterTemplate></asp:Repeater>图18 里可以看到现在Repeater的样子.看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注辰讯云资讯频道,感谢您对辰讯云的支持。...

ASP.NET 2.0中怎么利用DataList实现批量更新,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。第一步: 在DataList的 ItemTemplate创建一个可编辑的用户界面在前面创建一个标准的item级编辑的DataList时,我们使用了两个template:ItemTemplate — 包含只读的用户界面(使用 Label 显示每个product的 name 和price).EditItemTemplate — 包含编辑的用户界面(两个TextBox ).  DataList的EditItemIndex属性表明了哪个DataListItem使用EditItemTemplate来展示(如果有的话)。即ItemIndex的值等于DataList的EditItemIndex的DataListItem使用EditItemTemplate来展示。在一次只编辑一个item的情况下,这个模式工作的很好,但是在创建完全可编辑的DataList的时候就不适用了。  对完全可编辑的DataList来说,我们需要所有的DataListItem都以可编辑的界面来展示。最简单的方法是在ItemTemplate里定义可编辑的界面。对修改supplier的address信息而言,可编辑界面里supplier表现为文本,address,city和country的值都用TextBox来表示。  首先打开BatchUpdate.aspx页,添加一个DataList,将ID设为Suppliers。通过智能标签添加一个名为SuppliersDataSource的ObjectDataSource控件。图2: 创建一个名为SuppliersDataSource的ObjectDataSource使用SuppliersBLL类的GetSuppliers()方法配置ObjectDataSource(见图3)。象前面一章那样,我们将直接使用 BLL而不是通过ObjectDataSource来更新supplier信息。在UPDATE标签里选择None(见图4)。图 3: 使用GetSuppliers() 方法配置ObjectDataSource图 4: 设置UPDATE 标签为None  完成向导后,Visual Studio会自动生成DataList的ItemTemplate来在Label里显示每个数据字段。我们需要修改这个template让它提供编辑界面。ItemTemplate可以在设计器里通过DataList的智能标签上的Edit Templates或直接写声明语法来自定义。  创建一个编辑界面,将supplier的name表现为文本,address,city和country表现为TextBox。完成这些后,你的声明代码应该和下面差不多:<asp:DataList ID="Suppliers" runat="server" DataKeyField="SupplierID" DataSourceID="SuppliersDataSource"> <ItemTemplate>  <h5><asp:Label ID="CompanyNameLabel" runat="server"   Text='<%# Eval("CompanyName") %>' /></h5>  <table border="0">   <tr>    <td class="SupplierPropertyLabel">Address:</td>    <td class="SupplierPropertyValue">     <asp:TextBox ID="Address" runat="server"      Text='<%# Eval("Address") %>' />    </td>   </tr>   <tr>    <td class="SupplierPropertyLabel">City:</td>    <td class="SupplierPropertyValue">     <asp:TextBox ID="City" runat="server"      Text='<%# Eval("City") %>' />    </td>   </tr>   <tr>    <td class="SupplierPropertyLabel">Country:</td>    <td class="SupplierPropertyValue">     <asp:TextBox ID="Country" runat="server"      Text='<%# Eval("Country") %>' />    </td>   </tr>  </table>  <br /> </ItemTemplate></asp:DataList><asp:ObjectDataSource ID="SuppliersDataSource" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetSuppliers" TypeName="SuppliersBLL"></asp:ObjectDataSource>  注意:和前面一章一样,需要为DataList开启view state。  在ItemTemplate里我使用了两个新的CSS类,SupplierPropertyLabel和SupplierPropertyValue。它们的风格设置和ProductsPropertyLabel和ProductPropertyValue CSS类一样,并已经加入到Styles.css中。.ProductPropertyLabel, .SupplierPropertyLabel{  font-weight: bold;  text-align: right; }.ProductPropertyValue, .SupplierPropertyValue{  padding-right: 35px; }完成这些后浏览页面。如图5所示,每个DataList的item用文本显示supplier name,用TextBox显示address,city和country。图 5:  DataList里的每个Supplier都可编辑第二步: 增加“Update All” Button  图5里显示的信息暂时还没提供Update按钮。完全可编辑的DataList应该只包含一个"Update All"按钮,而不是象前面那样,每个item包含一个button。当点击"Update All"时,DataList里的所有记录将被更新。本章我们将添加两个"Update All"button- 一个在页的上面,一个在下面(两个都提供相同的功能)。  先在DataList上面添加一个ID为UpdateAll1的Button。然后在DataList下面添加ID为UpdataAll2的Button。两个Button的Text都设为"Update All"。最后为两个Button的Click事件都创建一个event handler。我们创建一个方法,“UpdateAllSupplierAddress”,然后在事件处理中调用它。(而不是在两个事件处理里复制相同的代码)protected void UpdateAll1_Click(object sender, EventArgs e){  UpdateAllSupplierAddresses(); }protected void UpdateAll2_Click(object sender, EventArgs e){  UpdateAllSupplierAddresses(); }private void UpdateAllSupplierAddresses(){  // TODO: Write code to update _all_ of the supplier addresses in the DataList}图6是添加完"Update All"button后的页面。图 6: 页面添加了两个“Update All” Button第三步: 更新所有的Suppliers的 Address 信息  完成了将所有的item显示为可编辑的界面和添加了“Update All”button后,剩下的事就是写代码执行批量更新。我们需要便利DataList的item,调用SuppliersBLL类的UpdateSupplierAddress方法。  可以通过DataList的Items property 来访问DataListItem集合。通过DataListItem的引用,我们可以从DataKeys集合里获取相关的SuppliserID,并引用ItemTemplate里的TextBox,见下面的代码:private void UpdateAllSupplierAddresses(){  // Create an instance of the SuppliersBLL class SuppliersBLL suppliersAPI = new SuppliersBLL();  // Iterate through the DataList's items foreach (DataListItem item in Suppliers.Items)  {   // Get the supplierID from the DataKeys collection  int supplierID = Convert.ToInt32(Suppliers.DataKeys[item.ItemIndex]);   // Read in the user-entered values  TextBox address = (TextBox)item.FindControl("Address");   TextBox city = (TextBox)item.FindControl("City");   TextBox country = (TextBox)item.FindControl("Country");   string addressValue = null, cityValue = null, countryValue = null;   if (address.Text.Trim().Length > 0)    addressValue = address.Text.Trim();   if (city.Text.Trim().Length > 0)     cityValue = city.Text.Trim();   if (country.Text.Trim().Length > 0)    countryValue = country.Text.Trim();   // Call the SuppliersBLL class's UpdateSupplierAddress method  suppliersAPI.UpdateSupplierAddress    (supplierID, addressValue, cityValue, countryValue);  } }  当用户点击一个"Update All"button时,每个Supplier DataList里的DataListItem都执行UpdateAllSupplierAddress方法,并调用SuppliersBLL类的UpdateSupplierAddress方法,将相关的值传过去。如果address,city或country里不输入值,UpdateSupplierAddress会接收一个空值(不是空字符串),而相关的字段的结果会是一个database NULL。  注意:你可以添加一个显示的状态Label,当批量更新完成后通过它来提供一些确认信息。只更新 Addresses被修改过的记录  本章使用的批量更新法则为每个DataList里的supplier调用UpdateSupplierAddress方法,无论address信息是否被修改过。虽然这种盲目的更新一般情况下不会有什么性能问题,但是如果你有做数据库表的审计,那样将会导致很多多余的记录。每次用户点击"Update All"button后,不管用户是否有修改,系统里都会为每个supplier产生一个一条新的审计记录。  ADO.NET的DateTable和DataAdapter类被设计用来支持批量更新那些仅仅被修改,删除或新增的记录。DataTable的每个row都有RowState property 来指明这个row是否是新增到DataTable或从它里面删除,修改,或没有改变。当DataTable刚产生时,所有的row都被标记为未修改的,修改了row的任何列后row会被标记为已修改的。  在SuppliersBLL类里我们首先将supplier的记录读进SuppliersDataTable里然后设置Address,City和Country列的值来更新指定的supplier的信息,见以下代码:public bool UpdateSupplierAddress (int supplierID, string address, string city, string country){  Northwind.SuppliersDataTable suppliers =   Adapter.GetSupplierBySupplierID(supplierID);  if (suppliers.Count == 0)   // no matching record found, return false  return false;  else {   Northwind.SuppliersRow supplier = suppliers[0];   if (address == null)    supplier.SetAddressNull();   else   supplier.Address = address;   if (city == null)    supplier.SetCityNull();   else   supplier.City = city;   if (country == null)    supplier.SetCountryNull();   else   supplier.Country = country;   // Update the supplier Address-related information  int rowsAffected = Adapter.Update(supplier);   // Return true if precisely one row was updated,  // otherwise false  return rowsAffected == 1;  } }  无论值是否有被修改,这段代码都将传入的address,city和country的值赋给SuppliersDataTable的SuppliersRow。这个修改将使SuppliersRow的RowState属性被标记为已修改的。当DAL的Update方法被调用时,它发现SupplierRow已经被修改了,因此向数据库发送UPDATE命令。  然而想象一下,我们为这个方法添加的代码仅仅在和已经存在的值不一样时才将传入的address,city和country的值赋给SuppliersRow。在address,city和country没有修改的情况下,SupplierRow的RowState仍然标记为未改变。这样的结果是当DAL的Update方法被调用时,SuppliersRow没有被修改,因此不会调用数据库。使用以下的代码代替前面盲目的赋值:// Only assign the values to the SupplierRow's column values if they differif (address == null && !supplier.IsAddressNull()) supplier.SetAddressNull();else if ((address != null && supplier.IsAddressNull()) ||   (!supplier.IsAddressNull() &&   string.Compare(supplier.Address, address) != 0)) supplier.Address = address;if (city == null && !supplier.IsCityNull()) supplier.SetCityNull();else if ((city != null && supplier.IsCityNull()) ||   (!supplier.IsCityNull() && string.Compare(supplier.City, city) != 0)) supplier.City = city;if (country == null && !supplier.IsCountryNull()) supplier.SetCountryNull();else if ((country != null && supplier.IsCountryNull()) ||   (!supplier.IsCountryNull() &&   string.Compare(supplier.Country, country) != 0)) supplier.Country = country;增加了这些代码后,DAL的Update方法仅仅在更改过address相关的值的那些记录里才向数据库发送UPDATE命令。  当然我们也可以追踪传入的字段和数据库数据是否有区别,如果没有,就不需要调用DAL的Update方法。这种方法在你使用直接的数据库命令时非常有效,因为直接的数据库命令不会检查SuppliersRow来决定是否需要调用数据库。  注意:每次UpdateSupplierAddress方法被调用时,都会调用一次数据库来获取需要更新的记录的信息。如果数据被修改,又要调用一次数据库来更新数据。这个流程可以通过创建一个重载的UpdateSupplierAddress方法来优化,这个方法接受一个EmployeesDataTable ,它包含BatchUpdate.aspx页的所有的修改。然后它会调用一次数据库来获取Suppliers表里的所有记录。在结果集里仅仅是被修改过的记录才能被更新。看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对辰讯云的支持。...

这篇文章主要讲解了“Linux基本命令df和linux中du命令参数的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux基本命令df和linux中du命令参数的用法”吧!以下是Linux基本命令df和linux中du命令参数介绍,希望对您的学习有所帮助。linux中df命令参数:linux中df命令参数用于查看Linux文件系统的状态信息,显示各个分区的容量、已使用量、未使用量及挂载点等信息。如df -k  以千字节KB 为单位显示各分区的信息df -a  显示所有分区包括大小为0 的分区df -T  显示分区类型EXT2 或EXT3 等linux中du命令参数:linux中du命令参数用于查看文件或文件夹的大小。如du -b /home  以字节为单位显示/home 文件夹下各个子文件夹的大小du -ks home  以千字节KB 为单位显示/home 文件夹的总大小感谢各位的阅读,以上就是“Linux基本命令df和linux中du命令参数的用法”的内容了,经过本文的学习后,相信大家对Linux基本命令df和linux中du命令参数的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是辰讯云,小编将为大家推送更多相关知识点的文章,欢迎关注!...

本篇文章给大家分享的是有关C++中怎么实现文件流操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++文件流操作之文件写入:#include < fstream> #include < iostream>   using namespace std;  int main(){  string str;  ofstream out("d.txt");  str="床前明月光\n疑是地上霜\n举头望明月\n低头思故乡\n";  out< < str< < endl;  return 0;   }C++文件流操作之文件读取:#include < fstream> #include < iostream>   using namespace std;  int main(){  ifstream in("a.txt");  for(string str;getline(in,str);)  cout< < str< < "\n";  return 0;   }C++文件流操作之文件复制#include < fstream> #include < iostream>   using namespace std;  int main(){  ifstream in("a.txt");  ofstream out("b.txt");  for(string str;getline(in,str);)  out< < str< < endl;  cout< < "文件复制成功!!!";  return 0;   }筛法判断素数程序#include < iostream> #include < vector> #include < fstream> using namespace std;  int main(){  vector< int> prime(10000,1);  for(int i=2;i< 100;++i)  if(prime[i])  for(int j=i;i*j< 10000;++j)  prime[i*j]=0;  ifstream in("c.txt");  for(int a;in>>a && a>1 && a< 10000;)  cout< < a< < " is "< < (prime[a]?"":"not ")< < " a prime.\n";   }c.txt文件中写入一系列小于10000的整数,并换行,就可以实现素数判断,因为也涉及文件的读取操作,所以一并给出。以上就是C++中怎么实现文件流操作,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注辰讯云资讯频道。...

本篇文章为大家展示了C++ 中怎么利用Builder操作Excel表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先新建一个表单Form1,保存单元文件Unit1.cpp,保存工程文件Project1.bpr。然后在表单中加入数据访问控件TTable,将Name属性设为Table1,DatabaseName属性设为BCDEMOS,TableName属性设为Country.db。在表单中加入一个按钮控件TButton,将其Name属性设为Button1,Caption属性设为 “转换为Excel文件”。双击Button1,在Button1Click()函数中加入如下代码:Variant ex,newxls;   int i,j=1;   try   {   ex=CreateOleObject(&Prime;Excel.Application&Prime;); //启动Excel   }   catch(...)   {   ShowMessage(&Prime;无法启动Excel&Prime;);   }   ex.OlePropertySet(&Prime;Visible&Prime;,(Variant)true); //使Excel启动后可见   newxls=(ex.OleFunction(&Prime;Workbooks&Prime;)).OleFunction(&Prime;Add&Prime;);//新建一个工作薄   Table1-〉Active=true;   //打开数据库   Table1-〉First();   for(i=0;i〈Table1-〉FieldCount;i++)   //将字段名写到工作薄的***行   {   (ex.OleFunction(&Prime;Cells&Prime;)).OlePropertySet(&Prime;Item&Prime;,(Variant)1,(Variant)(i+1),(Variant)Table1-〉Fields[i]-〉FieldName);   }   while(!Table1-〉Eof)   //将数据库中的记录依次写到工作薄中   {   jj=j+1;   for(i=0;i〈Table1-〉FieldCount;i++)   {   (ex.OleFunction(&Prime;Cells&Prime;)).OlePropertySet(&Prime;Item&Prime;,(Variant)j,(Variant)(i+1),   (Variant)Table1-〉Fields[i]-〉AsString);   }   Table1-〉Next();   }   newxls.OleFunction(&Prime;SaveAs&Prime;,(Variant)filename);   //保存工作薄,filename是工作薄的全文件名   ex.OleFunction(&Prime;Quit&Prime;);   //退出Excel,释放OLE对象  注意,要使用OLE自动化对象,在编译之前还必须在Unit1.cpp文件前面加上#include &Prime;ComObj.hpp&Prime;。运行程序就可以实现将数据库中的数据转换到Excel工作薄中。同样的道理,使用OlePropertyGet()函数,也可以将Excel工作薄中的数据读到数据库中去。上述内容就是C++ 中怎么利用Builder操作Excel表,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注辰讯云资讯频道。...

这期内容当中小编将会给大家带来有关C++中怎么连接MySqL数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++连接MySqL数据库代码示例:#include < stdio.h>   #include < stdlib.h>   #include < string.h>   #include < mysql/mysql.h>   int main()  {   MYSQL *mysql;   MYSQL_RES *res;   MYSQL_ROW row;   char query[1024];   int t,r;   mysql=mysql_init(NULL);   if(!mysql_real_connect(mysql,"test","root","123","test",0,NULL,0))   {   printf( "Error connecting to database: %s\n",mysql_error(mysql));   }   else  printf("Connected\n");   sprintf(query,"select * from first");   t=mysql_query(mysql,query);   if(t)   {   printf("Error making query:%s\n",mysql_error(mysql));   }   else  printf("Query made\n");   res=mysql_use_result(mysql);   for(r=0;r< mysql_field_count(mysql);r++)  {   row=mysql_fetch_row(res);   if(row< 0)   break;   for(t=0;t< mysql_num_fields(res);t++)   printf("%s",row[t]);   printf("\n");   }   mysql_close(mysql);   return 0;   }上述就是小编为大家分享的C++中怎么连接MySqL数据库了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注辰讯云资讯频道。...

这篇文章给大家介绍Jave中怎么对枚举进行操作,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。枚举其实就是一种类型,跟int, char 这种差不多,就是定义变量时限制输入的,你只能够赋enum里面规定的值。定义枚举 方法很简单,就跟定义一个类一样,只是把class换成 enum,其他的,你懂地。e.g:定义一个简单的枚举代码public enum WorkDay{         Monday,Tuesday,Wednesday,Thurday,Friday;//定义时,枚举值间有逗号隔开,***用分号结束       }废话不多说,直接上main 方法,拿去玩玩吧:Java代码public static void main(String []args)     {              /**                 * 枚举类型是一种类型,既然是类型,就是跟int,char他们 一样的,             * 拿来定义变量,限制你对变量的赋值,就像 int a,你不能够给a一个 string的值             * 同理,一个枚举用来定义一个变量时,你只能够赋枚举值,其方式为             * "枚举名.值"                */        WorkDay  myworkday=WorkDay.Wednesday;                 /** 补充点switch的基础知识,switch语句括号中支持byte \short \char \int类型,           * jdk 1.5以后支持枚举,所以,这里可以直接使用枚举变量myworkday。           * 呵呵,在jdk1.7后将switch将支持string              */             switch (myworkday)             {                        /*枚举重写了toString()方法,所以枚举变量的值不带前缀              * myworkday 里面的值应该是枚举括号里面的那几个              */            case Monday:                               System.out.println("you work day is Monday !");                 break;             case Tuesday:                             System.out.println("you work day is Tuesday!");                 break;             case Wednesday:                             System.out.println("you work day is Wednesday !");                 break;             case Thurday:                             System.out.println("you work day is Thurday !");                 break;             case  Friday:                      System.out.println("you work day is Friday !");                  break;             }         System.out.println("--------遍历所有值----------");         //----使用values()方法返回一个数组                  for(WorkDay day:WorkDay.values())         {                    System.out.println(day);         }         //-----既然是数组,就可以统计大小         System.out.println("WorkDay 里面有   "+WorkDay.values().length+" 个元素");                    //--------------------调用 ordinal()方法,返回枚举值在枚举中的索引,数组索引嘛,当然从0开始         System.out.println(WorkDay.Monday.ordinal());         System.out.println(WorkDay.Friday.ordinal());                  //---默认实现java.lang.Comparable接口 ,测试测试         System.out.println(WorkDay.Monday.compareTo(WorkDay.Thurday));//结果应该是 -3         //---Monday的索引为0,Thurday为 3,0-3=-3,         System.out.println(WorkDay.Friday.compareTo(WorkDay.Tuesday));//同理,结果应该为4-1=3,              }简单吧,来点狠的,前面说了,枚举有点像类,只是把class换成了enum,那么它跟一般的类一样可以添加属性或方法。带方法与属性的enum代码public enum WeAreJavaer{                   chinese,java, spring, DB2, AIX; // 枚举列表,必须写在最前面,否则编译出错             private final static String location = "javaeye";      //定义一个属性             public static WeAreJavaer getInfomation() {                       WeAreJavaer flag=null;                 if (location.equals("javaeye"))                   {                  flag=java;                                }                 else                  {                   flag= chinese;                  }                   return flag;                 }         }老规矩,直接上main()方法测试:写道public static void main(String []ags)   {   System.out.println("---------------------测试调用枚举中写的方法-------------------------------");   System.out.println("直接调用枚举里面的方法: "+ WeAreJavaer.getInfomation());   }3、来点更狠的。你可以通过括号来给enum赋值,这样的话,你必须有带参的构造方法,还需要有一属性与方法,否则编译时会出错。另外,你如果给enum里面的元素赋值的话,要么都赋,要么都不赋,不要东赋一个,西赋一个。如果不赋值则不能写构造方法,如果你赋值了,而没有构造方法,编译还是通不过,废话不多少,来,看:可赋值的enum代码public enum People {                     xiaowang(20), xiaozhang(32),xiaoli(50), xiaogou(21);            private final int age;                          People(int value) { //构造器只能是默认或者private, 从而保证构造函数只能在内部使用                this.age = value;            }            public int getAge() {                return age;            }        }好吧,啥也不说了,接下来的事,你懂地:测试带值enum代码public static void main(String[] args) {            for(People people:People.values()){                /*通过getValue()取得相关枚举的值*/                System.out.println(people+" 的年龄 :"+people.getAge());            }        }关于Jave中怎么对枚举进行操作就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

Python 中如何使用set函数

2021/7/14 22:46:04

这篇文章给大家介绍Python 中如何使用set函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。set集合函数主要用来去除重复:比如一个列表有多个重复值,可以用set搞掉>>> l = [1,2,3,4,5,4,3,21]>>>>>> l[1, 2, 3, 4, 5, 4, 3, 21]>>>>>>>>> set(l)set([1, 2, 3, 4, 5, 21])>>>set  可以做交集,并集,差集set的增删改增:>>> a = set([1,2,3,4])>>> aset([1, 2, 3, 4])>>>>>> a.add('alex')>>> aset([1, 2, 3, 4, 'alex'])删:>>> a.remove('alex')>>> aset([1, 2, 3, 4])>>>添加多项:>>> b = set([1,2,7,8])>>> bset([8, 1, 2, 7])>>> a.update(b)>>> aset([1, 2, 3, 4, 7, 8])判断b是否包含在a中>>> aset([1, 2, 3, 4, 7, 8])>>> bset([8, 1, 2, 7])>>>>>> b.issubset(a)Truepython中的“无序”set是和其他用平衡二叉树实现的set(如c++中用红黑树实现的set和python中的orderedset)相对而言的。基于平衡二叉树的set存取操作都是O(lgn)的时间,但是由于二叉搜索树的特点,可以很轻松的找到任意节点的前驱和后继节点,所以算是“有序”的。而python中的set基于哈希表实现,存取时间可看做O(1),但是没有办法高效的完成顺序相关的操作(比如找前驱后继,最大最小值等等),所以认为是“无序”的。关于Python 中如何使用set函数就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。...

今天就跟大家聊聊有关MySQL中有哪些事务控制语句,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。事务SQL 控制语句MySQL事务遵从ACID:• Atomic(原子性):所有语句作为一个单元全部成功执行或全部取消。• Consistent(一致性):如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。• Isolated(隔离性):事务之间不相互影响。• Durable(持久性):事务成功完成后,所做的所有更改都会准确地记录在数据库中。所做的更改不会丢失1) 事务SQL 控制语句• START TRANSACTION(或BEGIN):显式开始一个新事务• SAVEPOINT:分配事务过程中的一个位置,以供将来引用• COMMIT:永久记录当前事务所做的更改• ROLLBACK:取消当前事务所做的更改• ROLLBACK TO SAVEPOINT:取消在savepoint 之后执行的更改• RELEASE SAVEPOINT:删除savepoint 标识符• SET AUTOCOMMIT:为当前连接禁用或启用默认autocommit 模式2) AUTOCOMMIT 模式如何设置 AUTOCOMMIT 模式决定了如何以及何时开始新事务。默认情况下,AUTOCOMMIT 处于全局启用状态,这意味着会强制每个 SQL 语句隐式开始一个新事务。可以通过一个选项文件全局禁用 AUTOCOMMIT,也可以通过设置 autocommit 变量为每个会话禁用它。启用 AUTOCOMMIT 会限制每个语句,并进而影响其自身事务中的事务表。这样可以有效地防止在一个事务中执行多个语句。这意味着,您将无法通过 COMMIT 或 ROLLBACK 作为一个单元提交或回滚多个语句。有时,会将这种情况误认为根本没有事务。但是,情况并非如此。启用 AUTOCOMMIT 后,每个语句仍会以原子方式执行。例如,通过在插入多个行时比较违反约束限制的效果,便可看出启用 AUTOCOMMIT 和根本不具有事务之间的差别。在非事务表(如 MyISAM)中,一旦发生错误,语句就会终止,已经插入的行会保留在该表中。而对于 InnoDB 表,已经插入的所有行都会从该表中删除,从而不会产生任何实际影响。AUTOCOMMIT确定开始新事务的方式和时间;默认情况下, AUTOCOMMIT 模式处于启用状态:作为一个事务隐式提交每个语句;在my.cnf中将 AUTOCOMMIT 模式设置为 0,或者SET GLOBAL AUTOCOMMIT=0;SET SESSION AUTOCOMMIT=0; SET @@AUTOCOMMIT :=0; 则禁用 AUTOCOMMIT,事务会跨越多个语句,需要使用 COMMIT 或 ROLLBACK 结束事务;使用 SELECT 检查 AUTOCOMMIT 设置:SELECT @@AUTOCOMMIT;3) 隐式提交COMMIT 语句始终会显式提交当前事务。其他事务控制语句(例如,本幻灯片列出的语句)还具有隐式提交当前事务的作用。除了这些事务控制语句之外,其他类型的语句可能也具有隐式提交并进而终止)当前事务的作用。这些语句的行为就像在执行实际语句之前发出 COMMIT 一样。此外,这些语句本身并非事务语句,也就是说,如果成功,则无法回滚。通常,数据定义语句、据访问和用户管理语句以及锁定语句具有这种效果。注:有很多例外情况,而且这些语句并非都能在所有版本的服务器上导致隐式提交。但是,建议将所有非 DML 语句都视为可导致隐式提交。有关导致隐式提交的完整语句列表,请参阅《MySQL 参考手册》:http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html隐式提交会终止当前事务。用于隐式提交的 SQL 语句:l  START TRANSACTIONl  SET AUTOCOMMIT = 1导致提交的非事务语句:l  数据定义语句(ALTER、 CREATE 和 DROP)l  管理语句(GRANT、 REVOKE 和 SET PASSWORD)l  锁定语句(LOCK TABLES 和 UNLOCK TABLES)导致隐式提交的语句示例:Mysql>TRUNCATE TABLEMysql>LOAD DATA INFILE4) 事务存储引擎使用 SHOW ENGINES 列出引擎特征:mysql> SHOW ENGINES\G********************* 2. row *********************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking,and foreign keysTransactions: YESXA: YESSavepoints: YES********************* 1. row *********************Engine: MyISAMSupport: YESComment: MyISAM storage engineTransactions: NOXA: NOSavepoints: NO看完上述内容,你们对MySQL中有哪些事务控制语句有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注辰讯云资讯频道,感谢大家的支持。...