JAVA中的GridView每一个赋值,在ASP.NET 2.0中操作数据之六十二:GridView批量更新数据...

导言:

在前面的教程,我们对数据访问层进行扩展以支持数据库事务.数据库事务确保一系列的操作要么都成功,要么都失败。本文我们将注意力转到创建一个批更新数据界面.

在本文,我们将创建一个GridView控件,里面的每一行记录都可以进行编辑(见图1),因此我们没有必要多添加一列来包含Edit, Update,和Cancel按钮,而是在页面包含2个“Update Products”按钮,被点击时,遍历所有的产品并对数据库进行更新.让我们开始吧.

ceb13139b30d990bc4fbc6325e7be6ed.gif

图1:GridView控件里的每一行记录都可以编辑

注意:在第37章《DataList批量更新》里我们用一个DataList控件创建了一个批编辑界面, 那篇文章与本文的区别之一在于本文使用GridView控件且使用了事务.

考察设置所有GridView Rows可编辑的步骤

就像在第16章《概述插入、更新和删除数据》考察的那样,GridView控件使用内置的编辑功能编辑每一行记录。在其内部,GridView控件通过EditIndex属性来判断哪一行可编辑. 一旦GridView绑定到数据源之后,它就逐行检查,看哪行的index值与EditIndex的值匹配,如果找到的话,该行就呈现为编辑界面.如果是绑定列(BoundFields),则呈现为一个TextBox,其Text值为对应的BoundField的DataField属性的值;如果是模板列(TemplateFields),那么呈现为EditItemTemplate而不是ItemTemplate.

我们知道当某个用户点击某行的Edit按钮时,页面产生回传,将该行的index值为GridView控件的EditIndex属性赋值,再重新绑定数据.当点击某行的Cancel按钮后产生页面回传,在重新绑定数据以前,将EditIndex属性设置为-1.因为,对GridView控件的rows而言,开始时Index值为0,而将EditIndex设为-1的话就变成只读模式了.

如果只对行进行编辑,EditIndex属性工作正常,但不支持批编辑。要对GridView实施批编辑的话,我们必须使每行都呈现为编辑界面.为此,最简单的方法是将要编辑的列,转换为TemplateField,然后在ItemTemplate模板里创建编辑界面.在接下来的几步,我们将创建一个完整的可批编辑的GridView,在第一步,我们将创建一个GridView及其ObjectDataSource,并将BoundFields和CheckBoxField转换为TemplateFields。在第二步和第三步,我们将编辑界面从ItemTemplates模板转移到EditItemTemplates.

第一步:展示Product信息

首先,我们先创建一个显示产品信息的GridView.打开BatchData文件夹里的页面BatchUpdate.aspx,从工具箱拖一个GridView控件到页面,设ID值为ProductsGrid,从其智能标签里绑定到一个名为ProductsDataSource的ObjectDataSource,设其调用ProductsBLL class类的GetProducts方法.

2a6baa80fb77f41e2ba0bc4fa11a7587.gif

图2:设置ObjectDataSourc调用ProductsBLL Class类

13513c90872dc41313134311437327d5.gif

图3: 使用GetProducts方法获取产品信息

像GridView一样,该ObjectDataSource调用的方法也只能对每行记录起作用。为了批更新记录,我们必须在ASP.NET页面的后台代码类里多写些代码,批处理数据并传递给BLL.因此,在ObjectDataSource的UPDATE, INSERT,和DELETE标签里选“(None)”. 点Finish完成设置.

99e0249676962d75a8c885c5c8ecad22.gif

图4:在UPDATE, INSERT,和DELETE标签里选“(None)”

完成设置后,ObjectDataSource控件的声明代码看起来和下面的差不多:

OldValuesParameterFormatString="original_{0}"

SelectMethod="GetProducts" TypeName="ProductsBLL">

完成设置后,Visual Studio会向GridView控件添加BoundFields以及一个 CheckBoxField.就本文而言,我们只允许用户查看和编辑产品的名称、类别、价格、以及discontinued状态.将ProductName, CategoryName, UnitPrice和 Discontinued以外的列全部删除,并分别将头3个列的HeaderText属性设置为“Product”, “Category”,“Price”。最后,启用GridView的分页、排序功能.

此时,GridView控件含有3个BoundFields(ProductName,CategoryName,和UnitPrice)以及一个CheckBoxField (Discontinued).我们希望将这4个列转换为TemplateFields,并将编辑界面从TemplateField的EditItemTemplate模板转移到ItemTemplate模板.

注意:我们在第20章《定制数据修改界面》里探讨了如何创建并定制TemplateFields.我们将BoundFields和CheckBoxField转换成TemplateFields,然后再在ItemTemplates模板里定制其编辑界面。如果有什么不清楚的,可参考前面的文章.

从GridView的智能标签里,点“编辑列”,这将打开Fields对话框,然后选中每一列,点击“Convert this field into a TemplateField”。

8fbfffedffbf00e85af720740abb3082.gif

图5:将现有的BoundFields和CheckBoxField转换为TemplateField

现在每一列都是TemplateField,我们将把编辑界面从EditItemTemplates模板转移到ItemTemplates模板.

第2步:创建ProductName, UnitPrice,和Discontinued列的编辑界面

创建ProductName, UnitPrice,和Discontinued这3列的编辑界面是比较简单的,因为它们都在TemplateField的EditItemTemplate模板里定义好了的;而创建CategoryName的编辑界面比较麻烦,因为我们需要创建一个DropDownList控件来显示可用的categories,我们将在第3步实现.

我们首先创建ProductName的编辑界面。在GridView控件的智能标签里点“编辑模板”,再点ProductName TemplateField的EditItemTemplate项.选中其中的TextBox,将其复制、粘贴到ProductName TemplateField的ItemTemplate模板.将该TextBox的ID属性设置为ProductName.

然后,在ItemTemplate模板里添加一个RequiredFieldValidator控件,以确保用户输入的产品name不为空.将其ControlToValidate属性设置为“ProductName”;ErrorMessage属性为“You must provide the product's name.”;Text属性为“*”.添加完后,屏幕看起来应该像图6那样:

dfb873634f3fc253265985f302bb1967.gif

图6:ProductName TemplateField现在包含一个TextBox控件和一个 RequiredFieldValidator控件

对UnitPrice编辑界面而言,先从EditItemTemplate模板里将TextBox拷贝到ItemTemplate模板.然后,在TextBox前面放置一个“$”符合,将其ID属性设置为“UnitPrice”;Columns属性设置为“8”.

然后再添加一个CompareValidator控件,确保用户输入的是大于或等于$0.00的货币值.设其ControlToValidate属性为“UnitPrice”;ErrorMessage 属性为“You must enter a valid currency value. Please omit any currency symbols.”;Text属性为“*”;Type属性为Currency;Operator属性为GreaterThanEqual;ValueToCompare属性为“0”.

9b854155b7273c9d3930930469377fa4.gif

图7:添加一个CompareValidator控件以确保用户输入的是非负的货币值

对Discontinued TemplateField而言,直接使用已经在ItemTemplate模板里定义好了的CheckBox,只需要设其ID为“Discontinued”,Enabled属性为true.

第三步:创建CategoryName的编辑界面

CategoryName TemplateField的EditItemTemplate模板里的编辑界面里包含一个TextBox,其用来显示CategoryName列的值,我们要将其替换为一个DropDownList控件以显示categories.

注意:在第20章《定制数据修改界面》里我们详细地探讨了如何用DropDownList控件来替换TextBox控件。在此我们将过程一略而过,具体创建和设置DropDownList控件的细节可参考第20章.

从工具箱里拖一个DropDownList控件到CategoryNameTemplateField的ItemTemplate模板, 设其ID为Categories.通常情况下,我们会通过其智能标签来定义DropDownLists的数据源,来创建一个新的ObjectDataSource.然而,这将在ItemTemplate模板里新添一个ObjectDataSource,后果是每一个GridView row都会创建一个ObjectDataSource实例.因此,我们在GridView的TemplateFields外创建ObjectDataSource.结束模板编辑,从工具箱拖一个ObjectDataSource到页面,放置在名为ProductsDataSource的ObjectDataSource控件下面。将该新O用GetCategories Method bjectDataSource命名为CategoriesDataSource,设其使用CategoriesBLL class类的GetCategories方法.

c0a2269e67999843760ff05019c9d34e.gif

图8:设置该ObjectDataSource使用CategoriesBLL类

79647bdf2cb35bf6cd6ef540c4b07ad1.gif

图9:从GetCategories方法获取数据

因为该ObjectDataSource仅仅是用来检索数据,在UPDATE 和 DELETE标签里选 “(None)”.  点Finish完成设置.

70dd141ec629f203e7df9d56f2f908f2.gif

图10:在UPDATE和DELETE标签里选“(None)”

完成设置后,CategoriesDataSource的声明代码看起来根下面的差不多:

OldValuesParameterFormatString="original_{0}"

SelectMethod="GetCategories" TypeName="CategoriesBLL">

设置好后,返回CategoryName TemplateField的ItemTemplate模板,在DropDownList的智能标签里点“Choose Data Source”,在数据源设置向导里,在第一个下拉列表里选CategoriesDataSource;再下面的2个下拉列表里分别选CategoryName和CategoryID.

24f3596f3b806011a1f68bcf13d99c90.gif

图11:将DropDownList控件绑定到CategoriesDataSource

此时,DropDownList控件虽然列出了所有的categories,但对绑定到GridViewrow里的产品而言,其并没有自动的选择产品对应的category.为此,我们将DropDownList的SelectedValue值设置为产品的CategoryID值。在DropDownList的智能标签里点“Edit DataBindings”,并将SelectedValue属性赋值为CategoryID ,如图12:

c99a26183383918a7b8f71556c21a167.gif

图12:将产品的CategoryID值绑定到DropDownList的SelectedValue属性

还有最后一个问题,如果产品的CategoryID为空的话,对SelectedValue的数据绑定将会抛出异常. 因为DropDownList只列出了那些指定了CategoryID值的产品,但不会列出那些CategoryID值为NULL的产品.怎样解决呢?将DropDownList的AppendDataBoundIt属性设为rue,并向DropDownList新添加一个item,忽略其Value属性就像下面的声明代码那样:

DataSourceID="CategoriesDataSource" DataTextField="CategoryName"

DataValueField="CategoryID" SelectedValue=''>

-- Select One --

我们注意到 “-- Select One --”里,将Value属性设置为一个空字符串.为什么要新添该item来处理值为NULL的情况?为什么要将Value属性设置为一个空字符串呢?这些疑问可参考前面第20章《定制数据修改界面》

注意:这里有一个关乎性能的潜在问题要提一下。因为每行记录都包含一个DropDownList,其数据源为CategoriesDataSource.每次登录页面时,都会调用CategoriesBLL class类的GetCategories方法N次,这里N为GridView控件里行的数目.对GetCategories的N次调用就会导致对数据库的N次查询.我们可以对返回结果进行缓存以减轻对数据库造成的影响;至于方式嘛,可以运用per-request caching策略,也可以在缓存层Caching Layer里使用SQL高速缓存依赖性(SQL caching dependency)或基于短时间缓存周期(a very short time-based expiry)的策略。对per-request caching策略的更多信息可参考文章《HttpContext.Items – a Per-Request Cache Store》(http://aspnet.4guysfromrolla.com/articles/060904-1.aspx)

第四步:完善编辑界面

在浏览器里查看该页面,就像图13所示,每行都使用ItemTemplate模板,以包含其编辑页面。

51e1088193190a8d42767970437a9ca8.gif

图13:每个GridView Row都是可编辑的

不过仍有一些问题。首先,UnitPrice值为四个小数点,为此,返回UnitPrice TemplateField的ItemTemplate模板, 在TextBox的智能标签里点“Edit DataBindings”,然后,将Text属性格式指定为number.

0c9d40fe0e6854ced05c7d1565fc7cde.gif

图14:将Text格式指定为Number

然后,将Discontinued列里的checkbox控件居中(而不是居左),在GridView的智能标签里点“编辑列”,选取左边方框里的Discontinued,再在右边方框里的ItemStyle里将HorizontalAlign属性设置为Center,如图15所示:

4b8aace81637aedf58bb9ce55c998b97.gif

图15:将Discontinued列里的CheckBox居左

接下来在页面上添加一个ValidationSummar控件,将其ShowMessageBox属性设置为true;ShowSummary属性设置为false. 同时再添加一个Button Web控件,用来更新用户所做的更该。特别的,添加2个,一个在GridView控件上面,一个在下面,将它们的Text属性设置为“Update Products”.由于我们已经在TemplateFields模板定义了编辑界面,那么EditItemTemplates模板就显得多余了,将其删除.

完成上述修改后,你的页面声明代码看起来应该和下面的差不多:

DataKeyNames="ProductID" DataSourceID="ProductsDataSource"

AllowPaging="True" AllowSorting="True">

Text=''>

ControlToValidate="ProductName"

ErrorMessage="You must provide the product's name."

runat="server">*

SortExpression="CategoryName">

AppendDataBoundItems="True"

DataSourceID="CategoriesDataSource"

DataTextField="CategoryName"

DataValueField="CategoryID"

SelectedValue=''>

-- Select One --

SortExpression="UnitPrice">

$

Text=''>

ControlToValidate="UnitPrice"

ErrorMessage="You must enter a valid currency value.

Please omit any currency symbols."

Operator="GreaterThanEqual" Type="Currency"

ValueToCompare="0">*

Checked='' />

OldValuesParameterFormatString="original_{0}"

SelectMethod="GetProducts" TypeName="ProductsBLL">

OldValuesParameterFormatString="original_{0}"

SelectMethod="GetCategories" TypeName="CategoriesBLL">

ShowMessageBox="True" ShowSummary="False" />

当添加Button Web控件并对相关格式进行修改后,页面如下图所示:

0688cb1a797c524f671aafdc76bfe786.gif

图16:页面现在包含了2个“Update Products”按钮

第五步:更新产品

当用户登录该页面进行修改时并点击“Update Products”按钮时,我们需要将用户输入的值保存为一个ProductsDataTable instance实例;再将该实例传递给一个BLL method方法,进而将该实例传递给DAL层的UpdateWithTransaction  method方法。该方法是在前面的文章里创建的,确保对批处理进行原子操作.

在BatchUpdate.aspx.cs文件里创建一个名为BatchUpdate的方法,代码如下:

private void BatchUpdate()

{

// Enumerate the GridView's Rows collection and create a ProductRow

ProductsBLL productsAPI = new ProductsBLL();

Northwind.ProductsDataTable products = productsAPI.GetProducts();

foreach (GridViewRow gvRow in ProductsGrid.Rows)

{

// Find the ProductsRow instance in products that maps to gvRow

int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);

Northwind.ProductsRow product = products.FindByProductID(productID);

if (product != null)

{

// Programmatically access the form field elements in the

// current GridViewRow

TextBox productName = (TextBox)gvRow.FindControl("ProductName");

DropDownList categories =

(DropDownList)gvRow.FindControl("Categories");

TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");

CheckBox discontinued =

(CheckBox)gvRow.FindControl("Discontinued");

// Assign the user-entered values to the current ProductRow

product.ProductName = productName.Text.Trim();

if (categories.SelectedIndex == 0)

product.SetCategoryIDNull();

else

product.CategoryID = Convert.ToInt32(categories.SelectedValue);

if (unitPrice.Text.Trim().Length == 0)

product.SetUnitPriceNull();

else

product.UnitPrice = Convert.ToDecimal(unitPrice.Text);

product.Discontinued = discontinued.Checked;

}

}

// Now have the BLL update the products data using a transaction

productsAPI.UpdateWithTransaction(products);

}

该方法调用BLL层的GetProducts method方法,通过一个ProductsDataTable来获取所有的产品.然后遍历GridView控件的Rows collection集,该Rows collection集包含了GridView里每行所对应的GridViewRow instance实例。由于GridView里每页最多显示了10行,所以GridView控件的Rows collection集包含的条码最多不超过10条.

每行记录的ProductID来源于DataKeys collection集,并从ProductsDataTable里选出对应的ProductsRow.这4个TemplateField input控件的值赋值给ProductsRow instance实例的属性。当对ProductsDataTable更新完成后,又转到BLL业务逻辑层的UpdateWithTransaction method方法,就像我们在前面的教程看到的一样,该方法仅仅调用DAL数据访问层的UpdateWithTransaction方法.

本文使用的批更新策略是:将ProductsDataTable里对应于GridView里每行记录的所有row进行更新,不管用户有没有改动过产品信息.这种盲目的更改虽然执行起来没什么问题,但将会导致database table里出现多余的记录.在前面的第37章《DataList批量更新》里,我们考察里DataList控件的批更新界面,在那篇文章里我们使用饿代码只更新那些确实被用户改动过的记录.如果愿意的话,你可以使用37章的方法.

注意:当通过GridView的智能标签来绑定数据源时,Visual Studio会自动的将数据源的主键值指定为GridView的DataKeyNames属性.如果你没有通过GridView的智能标签来绑定ObjectDataSource的话,我们需要手工设置GridView控件DataKeyNames属性为“ProductID”, 以便通过DataKeys collection集来访问ProductID值.

BatchUpdate方法里的代码和BLL业务逻辑层里的UpdateProduct methods方法的代码很相似,主要的区别在于UpdateProduct methods方法仅仅获取一个单一的ProductRow instance实例.UpdateProducts methods方法里对ProductRow的属性赋值的代码与BatchUpdate方法里foreach循环里的代码是一模一样的.

最后,当点击任意一个“Update Products”按钮时,将调用BatchUpdate方法,为这2个按钮的Click events事件创建事件处理器,在里面添加如下的代码:

BatchUpdate();

ClientScript.RegisterStartupScript(this.GetType(), "message",

"alert('The products have been updated.');", true);

以上代码首先调用BatchUpdate()方法;再使用ClientScript property属性来注入JavaScript,以显示一个messagebox,提示“The products have been updated.”

花几分钟测试代码.在浏览器的登录BatchUpdate.aspx页面,编辑几行记录,点任意一个“Update Products”按钮。假定输入无误,你会看到一个消息框显示“The products have been updated.”为了测试原子操作,你可以任意添加一个CHECK约束,比如不接受UnitPrice的值为“1234.56”。然后再登录BatchUpdate.aspx页面,编辑几行记录,确保设置其中的一条记录的UnitPrice值为“1234.56”. 当点“Update Products”按钮时,将会出错。结果是所有的操作回滚,回到原来的值.

另一种可供选择的BatchUpdate方法

上面我们探讨的BatchUpdate方法从BLL业务逻辑层的GetProducts方法获取所有的产品.

如果GridView没有启用分页的话,一切都很完美.如果启用了分页了呢?比如可能总共有几百、几千、几万条产品记录,而GridView里每页只显示了10条记录。在这种情况下,该方法获取了所有的记录,但只更新其中的10条记录,实在是难称完美.

面对这种情况,可以考虑使用下面的BatchUpdateAlternate代替:

private void BatchUpdateAlternate()

{

// Enumerate the GridView's Rows collection and create a ProductRow

ProductsBLL productsAPI = new ProductsBLL();

Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();

foreach (GridViewRow gvRow in ProductsGrid.Rows)

{

// Create a new ProductRow instance

int productID = Convert.ToInt32(ProductsGrid.DataKeys[gvRow.RowIndex].Value);

Northwind.ProductsDataTable currentProductDataTable =

productsAPI.GetProductByProductID(productID);

if (currentProductDataTable.Rows.Count > 0)

{

Northwind.ProductsRow product = currentProductDataTable[0];

// Programmatically access the form field elements in the

// current GridViewRow

TextBox productName = (TextBox)gvRow.FindControl("ProductName");

DropDownList categories =

(DropDownList)gvRow.FindControl("Categories");

TextBox unitPrice = (TextBox)gvRow.FindControl("UnitPrice");

CheckBox discontinued =

(CheckBox)gvRow.FindControl("Discontinued");

// Assign the user-entered values to the current ProductRow

product.ProductName = productName.Text.Trim();

if (categories.SelectedIndex == 0)

product.SetCategoryIDNull();

else

product.CategoryID = Convert.ToInt32(categories.SelectedValue);

if (unitPrice.Text.Trim().Length == 0)

product.SetUnitPriceNull();

else

product.UnitPrice = Convert.ToDecimal(unitPrice.Text);

product.Discontinued = discontinued.Checked;

// Import the ProductRow into the products DataTable

products.ImportRow(product);

}

}

// Now have the BLL update the products data using a transaction

productsAPI.UpdateProductsWithTransaction(products);

}

该方法首先创建一个名为products的空白的ProductsDataTable,再通过BLL业务逻辑层的GetProductByProductID(productID)方法来获取具体的产品信息.获取的ProductsRow instance实例更新其属性,就像BatchUpdate()做的那样。更新完后,通过ImportRow(DataRow)method方法将row导入名为products的ProductsDataTable.

foreach循环完成后, products将包含那些对应于GridView里每行记录的ProductsRowinstance实例,由于这些实例是添加(而不是更新)到products,如果我们盲目的传递给UpdateWithTransaction method方法的话,ProductsTableAdatper会将每条记录插入数据库.在此,我们必须声明只对这些行进行更新(而不是添加).

为此,我们需要在业务逻辑层里添加一个名为UpdateProductsWithTransaction的方法来达到上述目的。该方法,就像下面代码显示的那样,将ProductsDataTable里的每一个ProductsRow instances实例的RowState设置为Modified,然后将该ProductsDataTable传递给DAL数据访问层的UpdateWithTransaction method方法.

public int UpdateProductsWithTransaction(Northwind.ProductsDataTable products)

{

// Mark each product as Modified

products.AcceptChanges();

foreach (Northwind.ProductsRow product in products)

product.SetModified();

// Update the data via a transaction

return UpdateWithTransaction(products);

}

总结:

GridView控件内置的编辑功能只能对每行进行编辑,对批编辑无能为力.就像本文探讨的那样,要创建一个批处理界面我们要多做一些工作。为此,我们需要将GridView里的列转换为TemplateFields,并在ItemTemplates模板里定义编辑界面,另外要在页面添加“Update All”按钮,该按钮与GridView彼此分开.该按钮的Click event事件必须要确保遍历GridView的Rows collection集、在一个ProductsDataTable里存储改动信息,然后再传递给相应的BLL业务逻辑层的方法.

下一篇,我们将考察如何创建一个批删除的界面,具体来说,每个GridView row都会包含一个checkbox。另外, 我们将用一个“Delete Selected Rows”按钮来替换“Update All”按钮.

祝编程快乐!

作者简介

本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软发布VS Code Jupyter插件!不止Python!多语言的Jupyter Notebook支持来了!

北京时间 2020 年 11 月 12 日,微软发布了全新的 VS Code Jupyter 插件!Jupyter 插件将 Jupyter Notebook 的功能引入 VS Code,并且将会支持更多语言和使用场景。Jupyter Notebook 支持创建和共享包含代码、方程式、文本和可视化内容的文档&a…

windows安全模式_鲁大师正式挂牌上市,使用鲁大师如何开启笔记本电脑全面节能模式...

10月10日消息,今天360旗下的鲁大师正式挂牌上市。上市之后,鲁大师的盘中涨幅一度扩大至100%,鲁大师的市值也一度达到了14亿港元。过去三个财年,鲁大师的营业收入分别为6981.2万、1.23亿和3.20亿人民币。简单介绍360,36…

跟我一起学Redis之Redis事务简单了解一下

前言关系数据库中的事务,小伙伴们应该是不陌生了,不管是在开发还是在面试过程中,总有两个问题逃不掉:•说说事务的特性;•事务隔离级别是怎么一回事?事务处理不好,数据就可能不准确,…

groovy 字符串截取最后一个_Python入门高级教程--Python 字符串

Python 字符串字符串是 Python 中最常用的数据类型。我们可以使用引号(或")来创建字符串。创建字符串很简单,只要为变量分配一个值即可。例如:var1 Hello World!var2 "Python Runoob"Python 访问字符串中的值Python 不支持单字符类型&a…

java面试题_阿里大厂流出的数百道 Java 经典面试题

BAT 常问的 Java基础39道常见面试题1.八种基本数据类型的大小,以及他们的封装类2.引用数据类型3.Switch能否用string做参数4.equals与的区别5.自动装箱,常量池6.Object有哪些公用方法7.Java的四种引用,强弱软虚,用到的场景8.Hashc…

​被冷落的运算符重载

基本类型可以使用运算符进行运算、比较、取反等操作。如果想使用运算符操作两个对象,我们就需要用到运算符重载。我们先看个例子,假如有个房子类,有长和宽两个属性。代码如下:接下来我们使用House类实例化两个对象:hou…

neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)

如果您想在不使用命令行的情况下执行流量诊断查询,那么WhatRoute是一个不错的选择。WhatRoute提供了一个干净且有条理的界面,主要提供Traceroute功能,但也可以执行Ping,域名服务查询,Whois查询以及监控进出计算机的流量…

快来参加学习.NET 挑战赛

今天访问dot.net 网站看到了一个学习.NET 挑战赛,发现已经赛程过半了,这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动,这些模块必须在 11 月底前完成。参加这个挑战赛,你必须从 .NET 学习挑战页面进入进…

excel怎么设置打印区域_别再浪费打印纸了!这样设置,Excel表格再大都能打印成一页!...

在打印Excel表格时,你是不是经常碰到过这种情况:明明排版好的表格,结果打印完却发现只显示一半......表格太宽导致无法打印在A4纸上......今天叨叨君就来分享几个有效的解决方法,教你轻轻松松将表格打印在一页纸上,一起…

xcode 修改 infodictionary_安卓系统修改复位键生效时间

文档说明本文档以SC806-CN-00(msm8909平台,Android 7)为例,说明如何修改复位键生效时间。应用背景默认情况下,按复位键,系统马上直接关机。在实际应用中,有可能由于干扰造成的抖动导致误关机行为。 为避免发生这种情况…

为什么曾经优秀的人突然变得平庸?

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第95篇原创文章一个读者的提问:洋哥,我从小都是学霸,本硕都是985,计算机科班出身,但进入职场后却始终无法取得突破。工作5年还是基层员工,我该怎…

java编程_Java编程和C语言的比较

很多人都拿Java编程和c语言相比较,那么今天小编就来先说说个人理解吧,新手学习Java很简单,上手也很容易,只需要会拼音就可以,简单而且没有门槛,而c语言学习成本高,更需要投入较大的精力&#xf…

.NET Core3.1升级.NET5,坑还真不少...

11月11号是电商狂欢的日子,也是.NET5正式发布的日子,媳妇儿等着零点秒杀,我却在刷新着微软官网等更新,然后第一时间开始折腾。此前Scott Hunter在博客信誓旦旦.NET Core3.1平滑迁移.NET5,于是当天就去升级我的宝藏项目…

requestPermissions读写手机存储权限_泛圈云盘可为企业建立高效安全的云办公在线协同文档存储?...

泛圈企业云盘结合智能手机和无线网络,实现对任何办公地点和办公时间的无缝访问,提高办公效率。它可以连接客户原有的各种IT系统,包括OA、邮件、ERP等各种个人业务系统,使手机也可以用来操作、浏览、管理公司的所有工作事务&#x…

怎么将SVG转成PNG(.NET工具包编写)

序一天,作者在深圳湾吹风时突然想到自己还有 20 多位粉丝,所以决定每周至少要水一篇文章。众所周知,一篇文章要有封面,正痛苦时,.NET 官方网站更新了一大波质量上乘的插图;高兴之余,发觉平台不支…

ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》

崩坏3、战双,虽然是手机游戏,作为一个PC党,我还是热衷于用电脑玩游戏。用电脑玩游戏可以把画质全部开到最大,依旧可以顺畅地进行游戏。手机就不行,即使是苹果,把画质拉满,依旧会有卡顿。特别是崩…

System.Text.Json中时间格式化

转自:Rayomcnblogs.com/Rayom/p/13967415.html简介.Net Core 3.0开始全新推出了一个名为System.Text.Json的Json解析库,用于序列化和反序列化Json,此库的设计是为了取代Json.Net(Newtonsoft.Json)时间格式化的不足System.Text.Json的优点就不…

windows server 启用 vss_windows服务器常用的安全加固方法

Windows操作系统本身已经提供了多种安全机制,如标识与鉴别、访问控制、用户账户控制、安全审计、文件系统。但是,这并不意味着操作系统就固若金汤。事实上,任何一个Windows版本都或多或少的存在着漏洞,而且在不断的被挖掘出来。Wi…

说说 C# 9 新特性的实际运用

前言你一定会好奇:“老周,你去哪开飞机了?这么久没写博客了。”老周:“我买不起飞机,开了个铁矿,挖了一年半的石头。谁知铁矿垮了,压死了几条蜈蚣,什么也没挖着。”所以,…

thinkpad笔记本散热风扇_十代酷睿笔记本低至2999元 你可以入手了_笔记本新闻

这年头3000元能干什么?买一套化妆品还是一套乐高积木?现在很严肃地告诉你,可以买一台笔记本,而且是搭载英特尔第十代酷睿处理器的轻薄笔记本——联想ThinkPad 翼14 Slim。联想ThinkPad 翼14 Slim轻薄笔记本其搭载了英特尔十代酷睿…