| new là từ khóa dùng để khai báo một phuơng thức mới khi cần che dấu phương thức cũ cùng tên trong lớp->Tính che dấu trong lập trình hướng đối tượng | ||||||
| virtual và override:Sử dụng tính đa hình(phủ quyết phương thức).VD:bạn có 2 phương thức tính tiền của 2 lớp cùng tên với phương thức của lớp cơ sở thì ở lớp cơ sở dùng Virtual còn lớp dẫn xuất dùng override->tính phủ quyết của OOP. | ||||||
| Tóm lại bản chất của OOP là:Phủ quyết và che dấu | ||||||
| Cách Phân biệt giữa từ khóa new và override : | ||||||
| • Từ khóa override dùng để định nghĩa lại (ghi đè) phương thức ảo (virtual) | ||||||
| hoặc phương thức trừu tượng (abstract) của lớp cơ sở, nó được dùng với | ||||||
| mục đích đa hình. | ||||||
| • Từ khóa new để che dấu thành viên của lớp cơ sở trùng tên với thành viên | ||||||
| của lớp dẫn xuất. | ||||||
23.
| https://yinyangit.wordpress.com/2011/06/02/net-serialization-and-deserialization-in-csharp/ | ||||||||||||||
| Từ khoá readonly thì linh động hơn từ khoá const. Bởi vì bạn có thể khởi tạo giá trị cho một trường chỉ đọc trong constructor. Và nó cho phép một trường chỉ đọc là một thể hiện(instance) hay một trường static có các giá trị khác nhau trong mỗi thể hiện của lớp đó. Nếu bạn muốn một trường chỉ đọc là static thì bạn phải khai báo tường minh. | ||||||||||||||
| Ví dụ: chúng ta có một chương trình chỉnh sửa tài liệu, và chúng ta muốn hạn chế số tài liệu được sửa đồng thời. Nhưng bởi vì ta bán phần mềm đó và người sử dụng có thể nâng cấp bản của họ. Chúng ta không thể cố định số lượng lớn nhất trong mã nguồn. Chúng ta cần một trường để mô tả giá trị lớn nhất này. Trường này chỉ được đọc tại mỗi lúc chương trình được ném ra: | ||||||||||||||
22. http://itshare24h.com/cac-truong-chi-doc-readonly-fields-trong-c/
Các trường chỉ đọc( Readonly fields):
Hằng là một biến mà chứa một giá trị không
thay đổi. Trong C# khái niệm hằng cũng giống như mọi ngôn ngữ khác. Tuy
nhiên, hằng thì không cần thiết dùng trong mọi trường hợp. Trong một số
trường hợp, bạn có một số biến không bị thay đổi nhưng giá trị của nó
chỉ được khởi tạo khi chương trình thực thi. C# hỗ trợ một kiểu biến
khác có lợi hơn trong trường hợp này là: các trường chỉ đọc.
Từ khoá readonly thì linh động hơn từ khoá const.
Bởi vì bạn có thể khởi tạo giá trị cho một trường chỉ đọc trong
constructor. Và nó cho phép một trường chỉ đọc là một thể hiện(instance)
hay một trường static có các giá trị khác nhau trong mỗi thể
hiện của lớp đó. Nếu bạn muốn một trường chỉ đọc là static thì bạn phải
khai báo tường minh.
21.
<asp:ImageButton Style="cursor: pointer" OnClientClick="javascript:if (confirm('Bạn có chắc muốn thực hiện chức năng này? ') == false) return false;"
ToolTip='<%# isUserLocked(Eval("e_username"))?"Mở tài khoản":"Khóa tài khoản"%>' AlternateText='<%# isUserLocked(Eval("e_username"))?"Mở tài khoản":"Khóa tài khoản"%>'
<asp:TemplateField HeaderText="Gender" SortExpression="Gender">
<ItemTemplate><%# (Boolean.Parse(Eval("Gender").ToString())) ? "Male" : "Female" %></ItemTemplate>
</asp:TemplateField>
20.
Displaying a Drop-Down List While Editing in the GridView Web Server Control
Displaying a Drop-Down List While Editing in the GridView Control<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID" DataSourceID="SqlDataSource1"> <Columns> <asp:CommandField ShowEditButton="True" /> <asp:BoundField DataField="EmployeeID" HeaderText="EmployeeID" InsertVisible="False" ReadOnly="True" SortExpression="EmployeeID" /> <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" /> <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" /> <asp:BoundField DataField="HireDate" HeaderText="HireDate" SortExpression="HireDate" /> <asp:TemplateField HeaderText="City" SortExpression="City"> <EditItemTemplate> <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" DataTextField="City" DataValueField="City" SelectedValue='<%# Bind("City") %>'> </asp:DropDownList> </EditItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("City") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" DeleteCommand="DELETE FROM [Employees] WHERE [EmployeeID] = @EmployeeID" InsertCommand="INSERT INTO [Employees] ([LastName], [FirstName], [HireDate], [City]) VALUES (@LastName, @FirstName, @HireDate, @City)" SelectCommand="SELECT [EmployeeID], [LastName], [FirstName], [HireDate], [City] FROM [Employees]" UpdateCommand="UPDATE [Employees] SET [LastName] = @LastName, [FirstName] = @FirstName, [HireDate] = @HireDate, [City] = @City WHERE [EmployeeID] = @EmployeeID"> <DeleteParameters> <asp:Parameter Name="EmployeeID" Type="Int32" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="LastName" Type="String" /> <asp:Parameter Name="FirstName" Type="String" /> <asp:Parameter Name="HireDate" Type="DateTime" /> <asp:Parameter Name="City" Type="String" /> <asp:Parameter Name="EmployeeID" Type="Int32" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="LastName" Type="String" /> <asp:Parameter Name="FirstName" Type="String" /> <asp:Parameter Name="HireDate" Type="DateTime" /> <asp:Parameter Name="City" Type="String" /> </InsertParameters> </asp:SqlDataSource> </div> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>" SelectCommand="SELECT DISTINCT [City] FROM [Employees]"></asp:SqlDataSource> </form> </body> </html>
19. Xóa từ link
BackColor="White" BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px"
CellPadding="4" Width="100%" onrowcommand="gv_RowCommand"
onsorting="gv_Sorting"
>
<Columns>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Delete"
OnClientClick='return confirm("Bạn chắc chắn muốn xóa không?");'
Text="Xóa">
<img src="WebMedia/ItemWeb/close.gif" border="0" alt="Edit.gif">
</asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<asp:BoundField DataField="PeopleID" HeaderText="PeopleID" >
<ItemStyle HorizontalAlign="Center" />
</asp:BoundField>
</Columns>
</asp:GridView>
protected void gv_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
selectedPeopleID = gv.DataKeys[e.RowIndex].Value.ToString();
tv1 = new ThuVien();
int result = tv1.SP_ExcecutePro("USP_People_Update", new string[] { "@flag", "@PeopleID", "@Deleted", "@ModifyPeopleID" }, new object[] { 4, selectedPeopleID, 1, Session["loginPeopleID"] });
if (result > 0)
{
lblThongBao.Text = Common.msgDeleteComplete;
btnTimKiem_Click(null, null);
}
else
lblThongBao.Text = "Xoá không thành công";
}
18. Xóa từ check box <asp:GridView ID="grdArticle" runat="server" AutoGenerateColumns="False" Width="100%">
<PagerStyle HorizontalAlign="Right" />
<HeaderStyle BackColor="#1C5679" ForeColor="White" />
<AlternatingRowStyle BackColor="WhiteSmoke" />
<Columns>
<asp:TemplateField HeaderText="Chọn">
<ItemStyle HorizontalAlign="Center" />
<ItemTemplate>
<A class=link title="Ch?nh s?a" href='<%=ArticleURL%><%#DataBinder.Eval(Container, "DataItem.ArticleID")%>'>
<IMG src="sysMedia/Images/Edit.gif" border="0"></A>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ArticleID" HeaderText="ArticleID" />
<asp:BoundField DataField="Title" HeaderText="Tiêu đề" />
<asp:BoundField DataField="InputDate" HeaderText="Ngày nhập" />
<asp:TemplateField HeaderText="Xóa">
<ItemStyle HorizontalAlign="Center" />
<ItemTemplate>
<asp:CheckBox ID="chkDelete" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Lịch sử">
<ItemStyle HorizontalAlign="Center" />
<ItemTemplate>
<a class="link" href='javascript:popUp("<%=LogArticleURL%><%#DataBinder.Eval(Container, "DataItem.ArticleID")%>")'
title="Xem l?ch s?"><img src="SysMedia/Images/logs.gif" border=0 /></a>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
If grdArticle.Rows.Count <= 0 Then
lblThongbao.Text = "Không có dữ liệu!"
Exit Sub
End If
'Xoá các mẫu tin được chọn
Dim del As New CheckBox
Dim i As Integer
Dim flag As Boolean = False
For i = 0 To grdArticle.Rows.Count - 1
'Tìm đến checkbox chọn xoá
del = CType(grdArticle.Rows(i).FindControl("chkDelete"), CheckBox)
If del.Checked = True Then
'nếu check bằng true, xoá mẫu tin theo ArticleID
mData.USP_Articles_ShiftDelete(Int32.Parse(grdArticle.Rows(i).Cells(1).Text))
'Xoá thư mục bài viết
cTmgctl.deleteFolder(WebConfigurationManager.AppSettings("ArticleFolder"), Int32.Parse(grdArticle.Rows(i).Cells(1).Text))
flag = True
End If
Next
If flag = True Then
lblThongbao.Text = "Dữ liệu đã được xóa"
ClickButton_GetRequest(True)
searchArticle()
Else
lblThongbao.Text = "Bạn chưa chọn bài viết để xoá"
End If
End Sub
17. Bạn cần cấp cho phần mã của trang web hoặc dịch vụ Web của bạn nhiều đặc quyền Windows hơn (như các quyền cho file, thiết lập Registry, cơ sở dữ liệu, và các tài nguyên khác), hoặc bạn cần hạn chế các đặc quyền hiện có.
Bạn có thể gán trực tiếp các đặc quyền cho tài khoản ASPNET cục bộ, hoặc có thể cấu hình mã ASP.NET của bạn để sử dụng một tài khoản hoàn toàn khác bằng cách chỉnh sửa thẻ <processModel> trong file machine.config.
Bạn cũng có thể sử dụng kỹ thuật giả nhận (impersonation) để một đoạn mã thực thi với các quyền của người dùng đã được IIS xác thực.
Mã ASP.NET không chạy dưới tài khoản người dùng đã được IIS xác thực hoặc tài khoản nặc danh IUSR_[ServerName]. Một phần lý do là tài khoản này thường không có đủ đặc quyền đối với mã ASP.NET (có thể tạo và xóa các file tạm để quản lý tiến trình biên dịch trang web).
Theo mặc định, các trang ASP.NET chạy bằng tài khoản ASPNET cục bộ, tài khoản này có một tập các đặc quyền bị giới hạn. Nếu cần mã ASP.NET của bạn thực hiện điều gì đó không được phép theo mặc định đối với tài khoản cục bộ (chẳng hạn, ghi ra ổ đĩa cứng trên server), bạn có thể cấp các quyền này cho tiến trình ASPNET.
Bạn cũng có thể thay đổi thiết lập này bằng cách mở file machine.config (nằm trong thư mục <Windows directory>\Microsoft.NET\ Framework\<version>\CONFIG\) và chỉnh sửa thẻ <processModel>.
File machine.config Bạn có thể thiết lập các đặc tính userName và password cho một người dùng bất kỳ, hoặc bạn có thể đưa vào sử dụng tiến trình ASPNET cục bộ (thiết lập userName là machine và password là AutoGenerate) hoặc tài khoản hệ thống cục bộ (thiết lập userName là SYSTEM và password là AutoGenerate).
Vì tài khoản hệ thống cục bộ có có đầy đủ quyền trên máy tính nên đừng bao giờ sử dụng tài khoản này ngoại trừ mục đích thử nghiệm.
Các thiết lập về tài khoản ASP.NET là toàn cục và tất cả các ứng dụng Web sẽ chia sẻ tài khoản mà bạn chỉ định.
Bạn cũng có thể thay đổi tài khoản dùng để thực thi các ứng dụng hoặc đoạn mã nào đó bằng kỹ thuật giả nhận.
Ví dụ
Để cấu hình một ứng dụng Web chạy dưới một tài khoản người dùng khác, bạn cần thêm thẻ <identity> vào file Web.config như sau:
<configuration>
<system.web>
<!-- Bỏ qua các thiết lập khác. -->
<identity impersonate="true" name="domain\user" password="pwd"/>
</system.web>
</configuration>
Bạn cũng có thể chỉ thị ứng dụng Web sử dụng identity đã được IIS xác thực, đó sẽ là tài khoản nặc danh IUSR_[ServerName] nếu bạn không sử dụng Windows authentication (đã được thảo luận trong mục 7.8).
Bạn chỉ cần thêm thẻ <identity> mà không phải thêm bất cứ thông tin xác thực nào:
<identity impersonate="true"/>
Nhớ rằng, đối với kiểu giả nhận này, tài khoản người dùng sẽ yêu cầu truy xuất đọc/ghi đến thư mục Temporary ASP.NET Files (nơi lưu trữ các file ASP.NET đã được biên dịch—được định vị tại \[WindowsDirectory]\Microsoft.NET\Framework\ [version]\Temporary ASP.NET Files).
Cuối cùng, bạn cũng có thể sử dụng kỹ thuật giả nhận bằng mã lệnh (vấn đề này sẽ được mô tả chi tiết trong mục 13.15).
Tuy vậy, ví dụ dưới đây sẽ làm việc cùng với Windows authentication. Nếu IIS đã xác thực người dùng (được mô tả trong mục 7.8), identity đó sẽ được thừa nhận khi sử dụng phương thức WindowsIdentity.Impersonate.
Để sử dụng đoạn mã này, bạn phải nhập không gian tên System.Security.Principal.
if (User.GetType() == typeof(WindowsPrincipal)) {
WindowsIdentity id = (WindowsIdentity)User.Identity;
WindowsImpersonationContext impersonate = id.Impersonate(); // (Thực hiện các tác vụ với ID này.)
// Trả lại ID.
impersonate.Undo();
} else {
16. System.Web.Security.FormsAuthentication.SetAuthCookie(strUserID, False) 'Username login K nhớ Tên đăng nhập và mật khẩu cho việc tự động đăng nhập lần sau
Session("AuthDiv") = iRet.ToString()
'ID、パスの記憶
'If CheckBox1.Checked = True Then
'cookieに書き込み Write cookie
Response.Cookies("adminDMCUserInfo")("ID") = strUserID
Response.Cookies("adminDMCUserInfo")("PASS") = strPassrowd
Response.Cookies("adminDMCUserInfo").Expires = DateTime.Now.AddDays(30)
15.
Cách làm: Form Authen đơn giản
Ví dụ này trình bày thực thi form quyền
ASP.NET đơn giản. Nó được thiết kế để minh họa các nguyên tắc cơ bản về cách sử
dụng các hình thức xác thực để login người dùng.
Một
cách thuận lợi là dùng Membership và Login control.
Membership cung cấp cách lưu trữ, quản lý
thông tin người dùng, các phương thức về xác nhận.
Login control đóng gói yêu cầu logic
credntials, validate users, about password.
Membership và Login control phủ 1 lớp trừu
tượng lên form authen và thay thế đến 100% công việc bạn sẽ phải làm một cách
bình thường để sử dụng forms authen.
Để biết thêm thông tin, xem Managing
Users by Using Membership and ASP.NET
Login Controls Overview.
·
Ở ví dụ này người dùng yêu cầu
tài nguyên được bảo vệ, cụ thể trang Default.aspx. Chỉ một người dùng có thể
truy cập nó: jchen@contoso.com, với mật
khẩu 123456. Tên và mật khẩu điền luôn vào Logon.aspx.
1.
Để cấu hình ứng dụng
a.
Open file Web.config
b.
Nếu chưa có thì tạo nó và điền
khúc này vô
1. <?xml
version="1.0"?>
2. <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
3. <system.web>
4.
5. </system.web>
6. </configuration>
-------------------------------------------------
điền tiếp
<system.web>
<authentication mode="Forms">
<forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH">
</forms>
</authentication>
</system.web>
·
loginUrl: Logon.aspx sử dụng
cho redirect nếu ASP.NET k tìm được authen cookie theo yêu cầu.
·
name: Tiếp đầu ngữ của cookie.
2.
Tạo tiếp phần tử authorization
……..
</authentication>
<authorization>
<deny users="?" />: người không có quyền bị từ chối truy cập tới
tài nguyên trong ứng dụng này.
</authorization>
</system.web>
3.
Tạo trang Logon
Khi người dùng yêu cầu bất cứ page nào từ Website và nếu chúng không được xác thực trước
đó, sẽ redirect tới Login.aspx.
Logon sưu tập user credential (email, password), nếu oki
quyền, trang logon redirect người dùng đến trang yêu cầu ban đầu. Trong ví dụ
này, xác thực được điền luôn trong trang này.
Textbox trong ví dụ chứa đoạn trình tiềm tàng
vấn đề bảo mật. Mặc định, Webpage đéo cho nhập script hoặc phần tử HTML (chi tiết
Script
Exploits Overview)
Login.aspx
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web.Security" %>
<script runat="server">
void Logon_Click(object sender, EventArgs e)
{
if ((UserEmail.Text == "jchen@contoso.com") &&
(UserPass.Text == "37Yj*99Ps"))
{
FormsAuthentication.RedirectFromLoginPage
(UserEmail.Text, Persist.Checked);
}
else
{
Msg.Text = "Invalid credentials. Please try again.";
}
}
</script>
<html>
<head id="Head1" runat="server">
<title>Forms Authentication - Login</title>
</head>
<body>
<form id="form1" runat="server">
<h3>
Logon Page</h3>
<table>
<tr>
<td>
E-mail address:</td>
<td>
<asp:TextBox ID="UserEmail" runat="server" /></td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="UserEmail"
Display="Dynamic"
ErrorMessage="Cannot be empty."
runat="server" />
</td>
</tr>
<tr>
<td>
Password:</td>
<td>
<asp:TextBox ID="UserPass" TextMode="Password"
runat="server" />
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2"
ControlToValidate="UserPass"
ErrorMessage="Cannot be empty."
runat="server" />
</td>
</tr>
<tr>
<td>
Remember me?</td>
<td>
<asp:CheckBox ID="Persist" runat="server" /></td>
</tr>
</table>
<asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On"
runat="server" />
<p>
<asp:Label ID="Msg" ForeColor="red" runat="server" />
</p>
</form>
</body>
</html>
Nếu xác thực OK mã gọi phương thức FormsAuthentication
class's RedirectFromLoginPage, truyền user, persist. Phương thức redirect đến trang yêu cầu
trước đó. Nếu xác thực k đúng thì hiển thị lỗi. Trang này có
System.Web.Security namespace, nó chứa class FormsAuthentication.
4.
Tạo trang mặc định:
Chúng ta k cấm user lạ vào
trang HTML, file media như ảnh, nhạc,… Khi user yêu cầu trang nào đó, form
authen sẽ kiểm tra xác thực và nếu cần thiết thì rediect người dùng đến trang
logon. Trang bạn tạo cũng có chức năng logout, nó xóa cookie (persisted
authentication ticket).
Trang default.aspx
<%@ Page Language="C#" %>
<html>
<head>
<title>Forms Authentication - Default Page</title>
</head>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
Welcome.Text = "Hello, " + Context.User.Identity.Name;
}
void Signout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
Response.Redirect("Logon.aspx");
}
</script>
<body>
<h3>
Using Forms Authentication</h3>
<asp:Label ID="Welcome" runat="server" />
<form id="Form1" runat="server">
<asp:Button ID="Submit1" OnClick="Signout_Click"
Text="Sign Out" runat="server" /><p>
</form>
</body>
</html>
Trang này hiển thị identity được xác thực,
sài lớp FormAuthentication. SignOut xóa identity và xóa cookie.
16.
BẢO MẬT TRONG ASP.NET WEB SERVICE (PHẦN 1)
Tháng Tư 20, 2011 — v8nguyenvan Một trong những vấn đề cần quan tâm khi sử dụng Web Service đó chính là vấn đề bảo mật và quản lý tài khoản truy cập. Do Web Service được đặt trên Web Server, và có thể được truy cập thông qua Internet nên cần phải có cơ chế kiểm soát quyền truy cập và thực hiện. Bài này sẽ giới thiệu một số kỹ thuật sử dụng trong vấn đề bảo mật cho Web Service.Quản lý tài khoản và phân quyền
ASP.NET cung cấp sẵn chức năng quản lý tài khoản và phân quyền thông qua thư việc System.Web.Security, trong đó lớp Membership quản lý các tài khoản và lớp Roles quản lý quyền và phân quyền. Các tài khoản có thể được tạo ra thông qua các trang quản trị hoặc dùng Web Service. Thông tin về các tài khoản được lưu trong một CSDL SQL Server có tên ASPNETDB.MDF (ngầm định).
Thiết lập quyền truy cập và sử dụng Web Service
Web Service cũng như Web Page, một số cho phép truy cập tự do, một số yêu cầu phải có quyền truy cập. Việc thiết lập quyền truy cập một Web Service được thực hiện như đối với Web Page, và thường được cấu hình trong web.config. Đoạn mã sau thiết lập quyền truy cập Administrators cho tất cả các trang trong thư mục admin:
Tuy nhiên cách thiết lập này thường được áp dụng đối với Web Page, còn đối với Web Service thường cho phép truy cập tự do nhưng thiết lập quyền thực hiện đối với từng phương thức. Để thiết lập quyền thực hiện phương thức, thêm thuộc tính PrincipalPermission và quy định quyền tương ứng.
Đối với những phương thức chỉ yêu cầu đăng nhập, không cần quan tâm đến nhóm, thì đặt Authenticated = true. Ví dụ để thực hiện phương thức GetCategories, chỉ cần đăng nhập thành công:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public DiscountDataSet.CategoriesDataTable GetCategories() {
return new DiscountDataSetTableAdapters.CategoriesTableAdapter().GetData();
}
Các phương thức cần thiết lập các quyền cụ thể, thì ứng với mỗi quyền đặt một thuộc tính PrincipalPermission. Ví dụ để thực hiện phương thức UpdateCategories, cần phải có quyền Administrators hoặc Editors, định nghĩa phương thức đó như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Role = “Administrators”)]
[PrincipalPermission(SecurityAction.Demand, Role = “Editors”)]
public void UpdateCategories(DiscountDataSet.CategoriesDataTable categories) {
new DiscountDataSetTableAdapters.CategoriesTableAdapter().Update(categories);
}
Đăng nhập và đăng xuất
Để có thể sử dụng các phương thức có thiết lập quyền thực hiện, cần phải đăng nhập với quyền tương ứng. Phương thức đăng nhập có thể được định nghĩa như sau:
[WebMethod]
public bool LogIn(string userName, string password) {
if (System.Web.Security.Membership.ValidateUser(userName, password)) {
FormsAuthentication.SetAuthCookie(userName, true);
return true;
} else {
return false;
}
}
Ở đây, việc kiểm tra tính hợp lệ của tài khoản được thực hiện bằng phương thức ValidateUser của Membership và đặt trạng thái đăng nhập bằng phương thức SetAuthCookie của FormsAuthentication. Để trạng thái đăng nhập được lưu lại phục vụ cho việc thực hiện các phương thức khác, phía client phải bật Cookie.
Phương thức đăng xuất được định nghĩa như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public void LogOut() {
if (Context.User.Identity.IsAuthenticated)
FormsAuthentication.SignOut();
}
Một trong những vấn đề cần quan tâm khi sử dụng Web Service đó chính là vấn đề bảo mật và quản lý tài khoản truy cập. Do Web Service được đặt trên Web Server, và có thể được truy cập thông qua Internet nên cần phải có cơ chế kiểm soát quyền truy cập và thực hiện. Bài này sẽ giới thiệu một số kỹ thuật sử dụng trong vấn đề bảo mật cho Web Service.
Quản lý tài khoản và phân quyền
ASP.NET cung cấp sẵn chức năng quản lý tài khoản và phân quyền thông qua thư việc System.Web.Security, trong đó lớp Membership quản lý các tài khoản và lớp Roles quản lý quyền và phân quyền. Các tài khoản có thể được tạo ra thông qua các trang quản trị hoặc dùng Web Service. Thông tin về các tài khoản được lưu trong một CSDL SQL Server có tên ASPNETDB.MDF (ngầm định).
15.
BẢO MẬT TRONG ASP.NET WEB SERVICE (PHẦN 2)
Tháng Tư 20, 2011 — v8nguyenvan Thiết lập quyền truy cập và sử dụng Web ServiceWeb Service cũng như Web Page, một số cho phép truy cập tự do, một số yêu cầu phải có quyền truy cập. Việc thiết lập quyền truy cập một Web Service được thực hiện như đối với Web Page, và thường được cấu hình trong web.config. Đoạn mã sau thiết lập quyền truy cập Administrators cho tất cả các trang trong thư mục admin:
Tuy nhiên cách thiết lập này thường được áp dụng đối với Web Page, còn đối với Web Service thường cho phép truy cập tự do nhưng thiết lập quyền thực hiện đối với từng phương thức. Để thiết lập quyền thực hiện phương thức, thêm thuộc tính PrincipalPermission và quy định quyền tương ứng.
Đối với những phương thức chỉ yêu cầu đăng nhập, không cần quan tâm đến nhóm, thì đặt Authenticated = true. Ví dụ để thực hiện phương thức GetCategories, chỉ cần đăng nhập thành công:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public DiscountDataSet.CategoriesDataTable GetCategories() {
return new DiscountDataSetTableAdapters.CategoriesTableAdapter().GetData();
}
Các phương thức cần thiết lập các quyền cụ thể, thì ứng với mỗi quyền đặt một thuộc tính PrincipalPermission. Ví dụ để thực hiện phương thức UpdateCategories, cần phải có quyền Administrators hoặc Editors, định nghĩa phương thức đó như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Role = “Administrators”)]
[PrincipalPermission(SecurityAction.Demand, Role = “Editors”)]
public void UpdateCategories(DiscountDataSet.CategoriesDataTable categories) {
new DiscountDataSetTableAdapters.CategoriesTableAdapter().Update(categories);
}
Đăng nhập và đăng xuất
Để có thể sử dụng các phương thức có thiết lập quyền thực hiện, cần phải đăng nhập với quyền tương ứng. Phương thức đăng nhập có thể được định nghĩa như sau:
[WebMethod]
public bool LogIn(string userName, string password) {
if (System.Web.Security.Membership.ValidateUser(userName, password)) {
FormsAuthentication.SetAuthCookie(userName, true);
return true;
} else {
return false;
}
}
Ở đây, việc kiểm tra tính hợp lệ của tài khoản được thực hiện bằng phương thức ValidateUser của Membership và đặt trạng thái đăng nhập bằng phương thức SetAuthCookie của FormsAuthentication. Để trạng thái đăng nhập được lưu lại phục vụ cho việc thực hiện các phương thức khác, phía client phải bật Cookie.
Phương thức đăng xuất được định nghĩa như sau:
[WebMethod]
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
public void LogOut() {
if (Context.User.Identity.IsAuthenticated)
FormsAuthentication.SignOut();
}
Sau khi đăng xuất, trạng thái đăng nhập bị xoá và để thực hiện được các phương thức có thiết lập quyền thì phải đăng nhập trở lại.
Để xác định trạng thái đăng nhập hiện thời, hoặc xem tài khoản đăng nhập hiện thời có nằm trong nhóm nào đó hay không, có thể định nghĩa các phương thức sau:
[WebMethod]
public bool IsAuthenticated() {
return Context.User.Identity.IsAuthenticated;
}
[WebMethod]
public bool IsInRole(string role) {
return System.Web.Security.Roles.IsUserInRole(role);
}
Bật Cookie phía client
Cookie dùng để lưu thông tin qua các lần gọi phương thức, ví dụ trạng thái đăng nhập. Để bật Cookie, cần phải tạo ra một đối tượng CookieContainer và gán cho thuộc tính CookieContainer của service.
service.CookieContainer = new CookieContainer();
14. Thuộc tính lưu biến property ispostback
public int SomeInteger
{
get
{
object o = ViewState["SomeInteger"];
if (o != null) return (int)o;
return 0;
//a default
}
set { ViewState["SomeInteger"] = value; }
}
13.
Pager Control for ASP.NET
A really simple to deploy ASP.NET Pager control.
Figure 1 - ASP.NET Pager Control
Introduction
Paging is an important thing that every web developer should know about. In ASP.NET onlyDataGrid and GridView has built-in support for paging. In ASP.NET 3.5 Microsoft has provided the first separated pager control for ASP.NET, called DataPager. But unfortunately it just supports paging for controls that they've implemented the IPageableItemContainer interface like ListView. So we still need a simple yet efficient control to do paging over almost any kind of item containers. Note 1: Although provided source and sample projects are categorized by the ASP.NET version, the Pager control's source is the same inside both ASP.NET 2.0 and ASP.NET 3.5 projects, but the ASP.NET 3.5 project has a sample to show how to utilize LINQ as Pager control's data provider.
Note 2: ASPnetPagerV2.8 doesn't support ASP.NET 1.1 for now.
What a Paging System Needs and What it is Supposed to Provide
Essential things we should provide to our paging system:- How many items I want to display per page, or "PageSize"
- Which page I am in, or "CurrentIndex"
- How many items(records) I have, or "ItemCount"
- Quasi hyperlinks to easily navigate through pages(see Figure 1)
- Items(results) which I want to show on the current page (like a DataSet or DataTable that is bindable)
What Parts does it Consist Of?
This paging system consists of the following parts and I will try to explain them:The first part:
A data access engine which gets required parameters from the Pager control and query database or other data source. Again, if you are using ASP.NET 3.5 maybe you want to write this part with LINQ otherwise this part is a Stored Procedure.
Second Part:
The Pager control which generates the hyperlinks for us in a user friendly way. These hyperlinks will be used by user to navigate through the pages.
The last but not the least:
And finally, a web page which hosts the Pager control and show paged results.
Deploying and customizing Pager control
Step by step explanation of Pager control's deployment1. Write your Own Business Specific Stored Procedure or LINQ Query
1.1 Paging on SQL Server 2000
Let me start with Stored Procedure. It comes with the demo project that you may have downloaded. Take a look at the screenshot below:12. string qs = Request.QueryString["s"];
Example :
// This is for the response.redirect pages. -->
protected void lnkEmailLink_Click(object sender, EventArgs e)
{
Response.Redirect("response_redirect_FORM.aspx?user=" + lblEmailUser.Text);
}
protected void Page_Load(object sender, EventArgs e)
{
string sValue = Request["user"].ToString();
lblEmailUser2.Text = sValue;
string strDomain = "@solake.net";
string strResult = sValue + strDomain;
lblResult.Text = strResult;
}
VB: Public SyohinID(20) As String
C#: public string[] SyohinID = new string[21];
Dim strOdrDay As String = DateTime.Now.ToString("yyyyMMdd") 'odrDay
11. Ghi cookie System.Web.Security.FormsAuthentication.SetAuthCookie(dt.Rows[0]["UserName"].ToString(), persist);
cái persist là biến bool, nếu là true thì hệ thống nó sẽ tự nhớ username và mật khẩu của lần trước để tự động đăng nhập, còn nếu là false thì nó sẽ không nhớ mật khẩu đâu.
1/ Cái FormsAuthentication thực chất nó làm 1 việc tương đối đơn giản là ghi vào 1 cái cookie có tên là ".ASPXAUTH" (chú ý là có dấu chấm) cái credital này được mã hóa kiểu quái quỷ gì đó mà khi decrypt (giải mã) ngược trở lại nó sẽ cho ta cái username. Mỗi lần nó mã hóa ra một đoạn mã khác nhau nhưng lần nào decrypt cũng ra cái tên 'aspnet'
2/ Và tiếp theo nó làm việc là ghi vào ServerVariables["AUTH_USER"] giá trị 'aspnet'.
Như thế để lấy ra user hiện tại chúng ta chỉ cần dùng mỗi lệnh này là ngon.
return HttpContext.Current.Request.ServerVariables["AUTH_USER"];
Ngoài ra chúng ta còn có thể dùng các cách lởm khác :
return HttpContext.Current.User.Identity.Name;
10. + throw là dùng để "quăng" cái lỗi đó ra cho thằng "phía trên" xử lí chứ nó không xử lí ngay.
Ví dụ hàm Object.calc() gọi Math.divide(a, b); để trả về kết quả là a/b. Nếu hàm divide kia throws ra cái Exception thì calc() hoặc là try catch để xứ lí nó hoặc tiếp tục throws lên trên. Trên cùng sẽ là hàm main. Nếu trong hàm main cũng không xử lí thì Exception sẽ xảy ra và CRASH! Vậy thôi
9.
Exact-number data types
that use integer data.
Data
type
|
Range
|
Storage
|
bigint
|
-2^63
(-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)
|
8 Bytes
|
int
|
-2^31 (-2,147,483,648) to
2^31-1 (2,147,483,647)
|
4 Bytes
|
smallint
|
-2^15 (-32,768) to 2^15-1
(32,767)
|
2 Bytes
|
tinyint
|
0 to 255
|
1 Byte
|
<ItemTemplate>
<img src="hinh/sanpham/" + <%# Eval("hinh") %> />
<br /><br />
<strong><%# Eval("sanphamName") %></strong>
</ItemTemplate>
</asp:DataList>
<asp:DataList ID="DS_Phim" runat="server">
<ItemTemplate>
<img src="hinh/sanpham/" + <%# Eval("hinh") %> />
<br /><br />
<strong><%# Eval("sanphamName") %></strong>
</ItemTemplate>
</asp:DataList>
- See more at: http://expressmagazine.net/development/1445/phan-trang-du-lieu-dung-collectionpager#sthash.dBMQsFp3.dpuf
<asp:DataList ID="DS_Phim" runat="server">
<ItemTemplate>
<img src="hinh/sanpham/" + <%# Eval("hinh") %> />
<br /><br />
<strong><%# Eval("sanphamName") %></strong>
</ItemTemplate>
</asp:DataList>
- See more at: http://expressmagazine.net/development/1445/phan-trang-du-lieu-dung-collectionpager#sthash.dBMQsFp3.dpuf
<asp:DataList ID="DS_Phim" runat="server">
<ItemTemplate>
<img src="hinh/sanpham/" + <%# Eval("hinh") %> />
<br /><br />
<strong><%# Eval("sanphamName") %></strong>
</ItemTemplate>
</asp:DataList>
- See more at: http://expressmagazine.net/development/1445/phan-trang-du-lieu-dung-collectionpager#sthash.dBMQsFp3.dpuf<asp:Repeater ID="rptEventList" runat="server">
<ItemTemplate>
<h4><%# Eval("PublishDate", "{0:dd/MM/yyyy}")%></h4>
7. Lọc table filter
DataView dv = new DataView(tbDinhMuc);
dv.RowFilter = "Hrm_EmployeeID=" + drv["Hrm_EmployeeID"].ToString(); // query example = "id = 10"
6. tbOffline.PrimaryKey = new DataColumn[] { tbOffline.Columns["OfflineID"] };
DataRow dr = tbOffline.Rows.Find(Convert.ToInt32(ddlOffline.SelectedValue));
lblTenDayDu.Text = dr["OfflineName"].ToString();
5.
<asp:CommandField ShowSelectButton="True"
SelectText="Show Details"/>
<asp:TemplateField>
<ItemTemplate>
<asp:GridView ID="GridView2" runat="server"
AutoGenerateColumns="False"
DataKeyNames="OrderID"
DataSourceID="SqlDataSource2"
Visible="false">
<Columns>
<asp:BoundField DataField="OrderID"
HeaderText="OrderID"
InsertVisible="False"
ReadOnly="True"
SortExpression="OrderID" />
<asp:BoundField DataField="OrderDate"
HeaderText="OrderDate"
SortExpression="OrderDate" />
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [CustomerID], [CompanyName]
FROM [Customers]">
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2"
runat="server"
ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [OrderID], [OrderDate]
FROM [Orders]
WHERE ([CustomerID] = @CustomerID)">
<SelectParameters>
<asp:Parameter Name="CustomerID" Type="String"/>
</SelectParameters>
</asp:SqlDataSource>
btnXoa.Attributes.Add("onClick", "javascript:return confirm('Bạn có chắc muốn xoá dữ liệu?');");
4.1 format number
<asp:BoundField DataField="EstimateSchoolFee" HeaderText="Học phí dự kiến"
DataFormatString="{0:#,###.##}" />
DataFormatString="{0:#,###}" />
4. Format date
String Format for DateTime [C#]
This example shows how to format DateTime using String.Format method. All formatting can be done also using DateTime.ToString method.Custom DateTime Formatting
There are following custom format specifiersy (year),
M (month), d (day), h (hour 12),
H (hour 24), m (minute), s (second),
f (second fraction), F (second fraction, trailing
zeroes are trimmed), t (P.M or A.M) and z
(time zone).Following examples demonstrate how are the format specifiers rewritten to the output.
[C#]
// create date time 2008-03-09 16:05:07.123 DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123); String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day String.Format("{0:h hh H HH}", dt); // "4 04 16 16" hour 12/24 String.Format("{0:m mm}", dt); // "5 05" minute String.Format("{0:s ss}", dt); // "7 07" second String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes String.Format("{0:t tt}", dt); // "P PM" A.M. or P.M. String.Format("{0:z zz zzz}", dt); // "-6 -06 -06:00" time zoneYou can use also date separator
/ (slash) and
time sepatator : (colon). These characters will be
rewritten to characters defined in the current DateTimeFormatInfo.DateSeparator
and DateTimeFormatInfo.TimeSeparator.[C#]
// date separator in german culture is "." (so "/" changes to ".") String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9/3/2008 16:05:07" - english (en-US) String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9.3.2008 16:05:07" - german (de-DE)Here are some examples of custom date and time formatting:
[C#]
// month/day numbers without/with leading zeroes String.Format("{0:M/d/yyyy}", dt); // "3/9/2008" String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008" // day/month names String.Format("{0:ddd, MMM d, yyyy}", dt); // "Sun, Mar 9, 2008" String.Format("{0:dddd, MMMM d, yyyy}", dt); // "Sunday, March 9, 2008" // two/four digit year String.Format("{0:MM/dd/yy}", dt); // "03/09/08" String.Format("{0:MM/dd/yyyy}", dt); // "03/09/2008"
Standard DateTime Formatting
In DateTimeFormatInfo there are defined standard patterns for the current culture. For example property ShortTimePattern is string that contains valueh:mm tt for en-US
culture and value HH:mm for de-DE culture.Following table shows patterns defined in DateTimeFormatInfo and their values for en-US culture. First column contains format specifiers for the String.Format method.
| Specifier | DateTimeFormatInfo property | Pattern value (for en-US culture) |
|---|---|---|
t |
ShortTimePattern | h:mm tt |
d |
ShortDatePattern | M/d/yyyy |
T |
LongTimePattern | h:mm:ss tt |
D |
LongDatePattern | dddd, MMMM dd, yyyy |
f |
(combination of D and t) |
dddd, MMMM dd, yyyy h:mm tt |
F |
FullDateTimePattern | dddd, MMMM dd, yyyy h:mm:ss tt |
g |
(combination of d and t) |
M/d/yyyy h:mm tt |
G |
(combination of d and T) |
M/d/yyyy h:mm:ss tt |
m, M |
MonthDayPattern | MMMM dd |
y, Y |
YearMonthPattern | MMMM, yyyy |
r, R |
RFC1123Pattern | ddd, dd MMM yyyy HH':'mm':'ss 'GMT' (*) |
s |
SortableDateTimePattern | yyyy'-'MM'-'dd'T'HH':'mm':'ss (*) |
u |
UniversalSortableDateTimePattern | yyyy'-'MM'-'dd HH':'mm':'ss'Z' (*) |
| (*) = culture independent |
[C#]
String.Format("{0:t}", dt); // "4:05 PM" ShortTime String.Format("{0:d}", dt); // "3/9/2008" ShortDate String.Format("{0:T}", dt); // "4:05:07 PM" LongTime String.Format("{0:D}", dt); // "Sunday, March 09, 2008" LongDate String.Format("{0:f}", dt); // "Sunday, March 09, 2008 4:05 PM" LongDate+ShortTime String.Format("{0:F}", dt); // "Sunday, March 09, 2008 4:05:07 PM" FullDateTime String.Format("{0:g}", dt); // "3/9/2008 4:05 PM" ShortDate+ShortTime String.Format("{0:G}", dt); // "3/9/2008 4:05:07 PM" ShortDate+LongTime String.Format("{0:m}", dt); // "March 09" MonthDay String.Format("{0:y}", dt); // "March, 2008" YearMonth String.Format("{0:r}", dt); // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123 String.Format("{0:s}", dt); // "2008-03-09T16:05:07" SortableDateTime String.Format("{0:u}", dt); // "2008-03-09 16:05:07Z" UniversalSortableDateTime
Truyền biến vào report crystal
Cách 1:
testCrystalReport1.SetParameterValue("MaChiNhanh", "aa");
testCrystalReport1.SetParameterValue("TenChiNhanh", "ccc");
Cách 2:
ParameterFields pfields = new ParameterFields();
ParameterField pfield1 = new ParameterField();
ParameterDiscreteValue GiaTri1 = new ParameterDiscreteValue();
ParameterField pfield2 = new ParameterField();
ParameterDiscreteValue GiaTri2 = new ParameterDiscreteValue();
GiaTri1.Value = "abc";
pfield1.Name = "MaChiNhanh";
pfield1.CurrentValues.Add(GiaTri1);
pfields.Add(pfield1);
GiaTri2.Value = "vvv";
pfield2.Name = "TenChiNhanh";
pfield2.CurrentValues.Add(GiaTri2);
pfields.Add(pfield2);
crystalReportViewer1.ParameterFieldInfo = pfields;
crystalReportViewer1.ReportSource = testCrystalReport1;
crystalReportViewer1.Refresh();
--------------------------------------------------------
int idChiNhanh;
string TenChiNhanh = "", MaChiNhanh = "", DiaChi = "", SoDienThoai = "";
object row = lu_ChiNhanh.Properties.GetDataSourceRowByKeyValue(lu_ChiNhanh.EditValue);
if (row != null)
{
idChiNhanh = Convert.ToInt32(lu_ChiNhanh.EditValue);
TenChiNhanh = ((DataRowView)row)["BranchName"].ToString();
MaChiNhanh = ((DataRowView)row)["BranchCode"].ToString();
DiaChi = ((DataRowView)row)["Address"].ToString();
SoDienThoai = ((DataRowView)row)["Phone"].ToString();
}
//LỌC DANH SÁCH
//QuanLyNhanVien.Report.TestCrystalReport1 testCrystalReport1 = new QuanLyNhanVien.Report.TestCrystalReport1();
rptThongKeNhanSu rpt_ThongKeNhanSu = new rptThongKeNhanSu();
CrystalDecisions.CrystalReports.Engine.TextObject str_MaChiNhanh;
str_MaChiNhanh = (CrystalDecisions.CrystalReports.Engine.TextObject)rpt_ThongKeNhanSu.ReportDefinition.ReportObjects["txtMaChiNhanh"];
str_MaChiNhanh.Text = str_MaChiNhanh.Text.Trim() + MaChiNhanh;
CrystalDecisions.CrystalReports.Engine.TextObject str_TenChiNhanh;
str_TenChiNhanh = (CrystalDecisions.CrystalReports.Engine.TextObject)rpt_ThongKeNhanSu.ReportDefinition.ReportObjects["txtTenChiNhanh"];
str_TenChiNhanh.Text = str_TenChiNhanh.Text.Trim() + TenChiNhanh;
CrystalDecisions.CrystalReports.Engine.TextObject str_DiaChi;
str_DiaChi = (CrystalDecisions.CrystalReports.Engine.TextObject)rpt_ThongKeNhanSu.ReportDefinition.ReportObjects["txtDiaChi"];
str_DiaChi.Text = str_DiaChi.Text.Trim() + DiaChi;
CrystalDecisions.CrystalReports.Engine.TextObject str_SoDienThoai;
str_SoDienThoai = (CrystalDecisions.CrystalReports.Engine.TextObject)rpt_ThongKeNhanSu.ReportDefinition.ReportObjects["txtSoDienThoai"];
str_SoDienThoai.Text = str_SoDienThoai.Text.Trim() + SoDienThoai;
ParameterFields pfields = new ParameterFields();
ParameterField pfield1 = new ParameterField();
ParameterDiscreteValue GiaTri1 = new ParameterDiscreteValue();
ParameterField pfield2 = new ParameterField();
ParameterDiscreteValue GiaTri2 = new ParameterDiscreteValue();
GiaTri1.Value = MaChiNhanh;
pfield1.Name = "MaChiNhanh";
pfield1.CurrentValues.Add(GiaTri1);
pfields.Add(pfield1);
GiaTri2.Value = TenChiNhanh;
pfield2.Name = "TenChiNhanh";
pfield2.CurrentValues.Add(GiaTri2);
pfields.Add(pfield2);
TKNS_TuyenNhanSuMoi rptTKNS_TuyenNhanSuMoi = new TKNS_TuyenNhanSuMoi();
QuanLyNhanVien.App_Data.DataSet1 ds1 = new QuanLyNhanVien.App_Data.DataSet1();
rptTKNS_TuyenNhanSuMoi.SetDataSource(tblDic_School);
//rpt_ThongKeNhanSu.Database.Tables[1].SetDataSource((DataTable)tblHrm_Employee);
rpt_ThongKeNhanSu.Database.Tables[0].SetDataSource((DataTable)tblHrm_Branch);
crystalReportViewer1.ParameterFieldInfo = pfields;
////SubReport
//ParameterFields sub_pfields = new ParameterFields();
//ParameterField sub_pfield1 = new ParameterField();
//ParameterDiscreteValue sub_GiaTri1 = new ParameterDiscreteValue();
//sub_GiaTri1.Value = "TH000046";
//sub_pfield1.Name = "MaChiNhanh";
//sub_pfield1.CurrentValues.Add(sub_GiaTri1);
//sub_pfields.Add(sub_pfield1);
//crystalReportViewer1.ParameterFieldInfo. rpt_ThongKeNhanSu.OpenSubreport("TKNS_TuyenNhanSuMoi.rpt").pa;
//rpt_ThongKeNhanSu.OpenSubreport("TKNS_TuyenNhanSuMoi.rpt").SetParameterValue("", "");
//testCrystalReport1.SetParameterValue("MaChiNhanh", "aa");
//testCrystalReport1.SetParameterValue("TenChiNhanh", "ccc");
crystalReportViewer1.ReportSource = rpt_ThongKeNhanSu;
//crystalReportViewer1.Refresh();