Chủ Nhật, 17 tháng 11, 2013

.NET linh tinh

24.

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.
lập trình 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
        <asp:GridView ID="gv" runat="server" DataKeyNames="PeopleID"  AutoGenerateColumns="False"
        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&#234;u đề" />
                    <asp:BoundField DataField="InputDate" HeaderText="Ng&#224;y nhập" />
                    <asp:TemplateField HeaderText="X&#243;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.
·         Ở 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 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)

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)

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();
}
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


, 11 Sep 2008 CPOL
A really simple to deploy ASP.NET Pager control.
pagerControl_pager_intro_1.gif

Figure 1 - ASP.NET Pager Control

Introduction

Paging is an important thing that every web developer should know about. In ASP.NET only DataGrid 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:
  1. How many items I want to display per page, or "PageSize"
  2. Which page I am in, or "CurrentIndex"
  3. How many items(records) I have, or "ItemCount"
Things the paging system is supposed to provide:
  1. Quasi hyperlinks to easily navigate through pages(see Figure 1)
  2. 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 deployment

1. 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



8b. <asp:DataList ID="DS_Phim" runat="server">
        <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
8.
            <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 specifiers y (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 zone

You can use also date separator / (slash) and time sepatator : (colon). These characters will be rewritten to characters defined in the current DateTimeForma­tInfo.DateSepa­rator and DateTimeForma­tInfo.TimeSepa­rator.
[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 DateTimeForma­tInfo there are defined standard patterns for the current culture. For example property ShortTimePattern is string that contains value h:mm tt for en-US culture and value HH:mm for de-DE culture.
Following table shows patterns defined in DateTimeForma­tInfo 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 SortableDateTi­mePattern yyyy'-'MM'-'dd'T'HH':'mm':'ss (*)
u UniversalSorta­bleDateTimePat­tern yyyy'-'MM'-'dd HH':'mm':'ss'Z' (*)
(*) = culture independent
Following examples show usage of standard format specifiers in String.Format method and the resulting output.
[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();