1. Trang chủ
  2. » Công Nghệ Thông Tin

ASP.NET 4 Unleased - p 62 doc

10 239 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 546,9 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

FIGURE 12.7 Editing a record with the DetailsView control.. Updating Data with the DetailsView Control You can use the DetailsView control to update existing database records.. To updat

Trang 1

FIGURE 12.7 Editing a record with the DetailsView control

Updating Data with the DetailsView Control

You can use the DetailsView control to update existing database records To update an

existing record, assign the value True to the DetailsView control’s

AutoGenerateEditButton property, as illustrated in Listing 12.10 (see Figure 12.7)

LISTING 12.10 ShowUpdate.aspx

<%@ Page Language=”C#” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

<title>Show Update</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

Trang 2

<asp:DetailsView

id=”dtlMovies”

DataKeyNames=”Id”

AutoGenerateEditButton=”true”

AllowPaging=”true”

DataSourceID=”srcMovies”

Runat=”server” />

<asp:SqlDataSource

id=”srcMovies”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Id,Title,Director,InTheaters FROM Movies”

UpdateCommand=”UPDATE Movies SET Title=@Title,Director=@Director,

InTheaters=@InTheaters WHERE Id=@Id”

Runat=”server” />

</div>

</form>

</body>

</html>

When you open the page in Listing 12.10, the record appears in Read Only mode You can

click the Edit button to switch the DetailsView into Edit mode and update the record

The DetailsView control includes a DataKeyNames property and an

AutoGenerateEditButton property The DataKeyNames property contains the name of the

primary key column The AutoGenerateEditButton property automatically generates the

user interface for editing the record

The SqlDataSource control includes an UpdateCommand The UpdateCommand updates the

Title, Director, and InTheaters database columns

If you want the DetailsView control to initially appear in Edit mode, you can set the

DetailsView control’s DefaultMode property to the value Edit For example, the page in

Listing 12.11 contains a Master/Detail form If you select any of the records in GridView,

you can edit the record with the DetailsView control (see Figure 12.8)

Trang 3

ptg FIGURE 12.8 Displaying a Master/Detail form with the DetailsView control

LISTING 12.11 MasterDetailEdit.aspx

<%@ Page Language=”C#” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<script runat=”server”>

void Page_Load()

{

if (!Page.IsPostBack)

grdMovies.SelectedIndex = 0;

}

protected void dtlMovies_ItemUpdated(object sender, DetailsViewUpdatedEventArgs

➥e)

{

grdMovies.DataBind();

}

</script>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

<style type=”text/css”>

html

Trang 4

{

background-color:silver;

font:14px Georgia,Serif;

}

.content

{

margin:auto;

width:600px;

background-color:white;

}

.column

{

float:left;

width:250px;

}

.selectedRow

{

background-color:yellow;

}

</style>

<title>Master/Detail Edit</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div class=”content”>

<div class=”column”>

<asp:GridView

id=”grdMovies”

DataSourceID=”srcMovies”

DataKeyNames=”Id”

AutoGenerateSelectButton=”true”

SelectedRowStyle-CssClass=”selectedRow”

Runat=”server” />

</div>

<div class=”column”>

<asp:DetailsView

id=”dtlMovies”

DefaultMode=”Edit”

AutoGenerateEditButton=”true”

AllowPaging=”true”

DataSourceID=”srcMovieDetails”

DataKeyNames=”Id”

Runat=”server” OnItemUpdated=”dtlMovies_ItemUpdated” />

Trang 5

<asp:SqlDataSource

id=”srcMovies”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Id,Title FROM Movies”

Runat=”server” />

</div>

<asp:SqlDataSource

id=”srcMovieDetails”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Id,Title,Director,InTheaters FROM

Movies WHERE Id=@MovieId”

UpdateCommand=”UPDATE Movies SET Title=@Title,Director=@Director,

InTheaters=@InTheaters WHERE Id=@Id”

Runat=”server”>

<SelectParameters>

<asp:ControlParameter Name=”MovieId” ControlID=”grdMovies” />

</SelectParameters>

</asp:SqlDataSource>

</div>

</form>

</body>

</html>

The DetailsView control includes a DefaultMode property set to the value Edit When you

select a record, the record displays by DetailsView in Edit mode by default

Using Templates When Editing

By default, you don’t get any validation when editing records with the DetailsView

control In other words, there is nothing to prevent you from attempting to submit a null

value to a database column that does not accept null values If you need to perform

vali-dation, you need to use templates with the DetailsView control

The page in Listing 12.12 uses TemplateFields for the Title and BoxOfficeTotals columns

Both TemplateFields contain a RequiredFieldValidator The BoxOfficeTotals column

also includes a CompareValidator to check whether the value entered is a currency value

(see Figure 12.9)

Trang 6

FIGURE 12.9 Using a template when editing with the DetailsView control

LISTING 12.12 TemplateEdit.aspx

<%@ Page Language=”C#” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

<title>Template Edit</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<asp:DetailsView

id=”dtlMovies”

AutoGenerateRows=”false”

AutoGenerateEditButton=”true”

AllowPaging=”true”

DefaultMode=”Edit”

DataSourceID=”srcMovies”

DataKeyNames=”Id”

Runat=”server”>

Trang 7

<Fields>

<asp:TemplateField HeaderText=”Title:”>

<EditItemTemplate>

<asp:TextBox

id=”txtTitle”

Text=’<%# Bind(“Title”) %>’

runat=”server” />

<asp:RequiredFieldValidator

id=”reqTitle”

ControlToValidate=”txtTitle”

Text=”(required)”

Display=”Dynamic”

Runat=”server” />

</EditItemTemplate>

</asp:TemplateField>

<asp:TemplateField HeaderText=”Box Office Totals:”>

<EditItemTemplate>

<asp:TextBox

id=”txtBoxOfficeTotals”

Text=’<%# Bind(“BoxOfficeTotals”, “{0:f}”) %>’

runat=”server” />

<asp:RequiredFieldValidator

id=”reqBoxOfficeTotals”

ControlToValidate=”txtBoxOfficeTotals”

Text=”(required)”

Display=”Dynamic”

Runat=”server” />

<asp:CompareValidator

id=”cmpBoxOfficeTotals”

ControlToValidate=”txtBoxOfficeTotals”

Text=”(invalid)”

Display=”Dynamic”

Operator=”DataTypeCheck”

Type=”currency”

Runat=”server” />

</EditItemTemplate>

</asp:TemplateField>

</Fields>

</asp:DetailsView>

<asp:SqlDataSource

id=”srcMovies”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Id,Title,BoxOfficeTotals FROM Movies”

UpdateCommand=”UPDATE Movies SET Title=@Title,

BoxOfficeTotals=@BoxOfficeTotals WHERE Id=@Id”

Trang 8

Runat=”server” />

</div>

</form>

</body>

</html>

If you attempt to edit a record, and you do not provide a value for the Title or

BoxOfficeTotals columns, a validation error displays Also, if you enter anything other than

a currency amount for the BoxOfficeTotals column, a validation error message displays

Handling Concurrency Issues

What happens when two users edit the same record at the same time? By default, the last

user to update the database record wins In other words, one user can overwrite changes

made by another user

Imagine that Sally opens a page to edit a database record After opening the page, Sally

leaves for her 2-week vacation in Las Vegas While Sally is vacationing, Jim edits the same

record and submits his changes When Sally returns from vacation, she submits her

changes Any modifications that Jim makes are overwritten by Sally’s changes

If you need to prevent this scenario, you can take advantage of optimistic concurrency The

SqlDataSource control’s ConflictDetection property supports the following two values:

CompareAllValues

OverwriteChanges

By default, the ConflictDetection property has the value OverwriteChanges If you set

this property to the value CompareAllValues, the SqlDataSource tracks both the original

and modified versions of each column

For example, the page in Listing 12.13 doesn’t enable a user to update a record when the

original record has been modified after the user has opened the page

LISTING 12.13 Concurrency.aspx

<%@ Page Language=”C#” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<script runat=”server”>

protected void srcMovies_Updated(object sender, SqlDataSourceStatusEventArgs e)

{

if (e.AffectedRows == 0)

lblMessage.Text = “Could not update record”;

Trang 9

}

</script>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

<title>Concurrency</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<asp:Label ID=”lblMessage” EnableViewState=”false” runat=”server” />

<asp:DetailsView

id=”dtlMovies”

DataKeyNames=”Id”

AutoGenerateEditButton=”true”

AllowPaging=”true”

DataSourceID=”srcMovies”

Runat=”server” />

<asp:SqlDataSource

id=”srcMovies”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Id,Title,Director,InTheaters FROM Movies”

UpdateCommand=”UPDATE Movies

SET Title=@Title,Director=@Director,InTheaters=

WHERE Title=@original_Title

AND Director=@original_Director

AND InTheaters=@InTheaters

AND Id=@original_Id”

ConflictDetection=”CompareAllValues”

OldValuesParameterFormatString=”original_{0}”

Runat=”server” OnUpdated=”srcMovies_Updated” />

</div>

</form>

</body>

</html>

Notice the contents of UpdateCommand in Listing 12.13 The current values are compared

against the original values for each database column when updating a record If the

current and original values don’t match, the record is not updated

Trang 10

The SqlDataSource has both its ConflictDetection and OldValuesParameterFormat

String properties set The OldValuesParameterFormatString specifies the prefix added to

the parameters that represent the original field values

If there is a concurrency conflict, the e.AffectedRows property passed to the Updated

event handler will have the value 0 In Listing 12.13, a message is displayed in a Label

control when a record cannot be updated

Inserting Data with the DetailsView Control

You can use the DetailsView control to insert new records into a database table For

example, the page in Listing 12.14 enables you to insert a new record into the Movies

database table

LISTING 12.14 ShowInsert.aspx

<%@ Page Language=”C#” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head id=”Head1” runat=”server”>

<title>Show Insert</title>

</head>

<body>

<form id=”form1” runat=”server”>

<div>

<asp:DetailsView

id=”dtlMovies”

AllowPaging=”true”

DataSourceID=”srcMovies”

AutoGenerateInsertButton=”true”

Runat=”server” />

<asp:SqlDataSource

id=”srcMovies”

ConnectionString=”<%$ ConnectionStrings:Movies %>”

SelectCommand=”SELECT Title,Director,InTheaters FROM Movies”

InsertCommand=”INSERT Movies (Title,Director,InTheaters)

VALUES (@Title,@Director,

Runat=”server” />

</div>

</form>

</body>

</html>

Ngày đăng: 06/07/2014, 18:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN