.NET FAQ

Trang này được tạo ra để tổng hợp các câu hỏi thường gặp (Frequently asked questions – FAQ) trong .NET. Bạn cũng có thể đặt câu hỏi tại đây và cũng có thể tham gia trả lời. Tôi sẽ cập nhật và xây dựng một câu hỏi/đáp đầy đủ cho các vấn đề mà bạn đang vướng mắc.

Bạn nên đặt câu hỏi bằng một câu ngắn gọn, tóm lược nội dung của vấn đề, điều này sẽ giúp tôi và người đọc dễ xác định được vấn đề cũng như cập nhật câu hỏi. Ví dụ:
– .NET Framework là gì?
– Làm sao để truyền dữ liệu giữa hai Form?

Danh sách câu hỏi

Hook

1. Chặn thông điệp bàn phím bằng Hook (từ bạn DuyBK)

53 thoughts on “.NET FAQ

  1. Chào bạn
    Nhân tiện mình muốn hỏi bạn 1 vấn đề trong C#, mong nhận được sự góp ý từ bạn

    Mình muốn làm 1 soft sử dụng hook với chức năng thay thế 1 key khác. Ví dụ mình đặt chức năng khi ta nhấn key S thì program sẽ tự động press key numpad1… Mình sử dụng SendKeys.Send thì chức năng này chỉ sự dụng được khi mình viết 1 đoạn text nào đó mà thôi. Ví dụ khi mình chạy soft này, mở Word nhấn S thì sẽ ra “s1” v…v…
    1 số phần mềm khác bắt buộc ta phải ấn numpad1 để chạy 1 chức năng của nó. Cái mình muốn là có cách nào là khi mình ấn S thì soft tạo ra sẽ “nhấn hộ” mình key numpad1 trong phần mềm kể trên được ko ? Xài SendKeys.Send mình đã thử và ko có tác dụng !!

    Nếu bạn biết cách giải quyết thì mình mong bạn bớt chút thời gian giúp đỡ

    Chào thân ái.

    Trả lời
  2. Chào YinYang,
    Mình có thắc mắc là trong khai báo sau, thì từ khoá in có ý nghĩa gì?
    public delegate void Action(
    T1 arg1,
    T2 arg2,
    T3 arg3,
    T4 arg4,
    T5 arg5,
    T6 arg6,
    T7 arg7,
    T8 arg8,
    T9 arg9,
    T10 arg10,
    T11 arg11
    )

    Trả lời
  3. Đoạn code trên là khai báo delegate Action của C# 4.0 đó, không hiểu sau khi đưa vô đây thì bị mất từ khoá “in”
    Mình coi trên MSDN thì thấy nói in là contravariant.
    Sau đây là đoạn code khai báo hàm, mình không hiểu in T1, in T2, … nghĩa là gì? (nếu là generic thì chỉ cần thôi chứ)

    public delegate void Action (
    T1 arg1,
    T2 arg2,
    T3 arg3,
    T4 arg4,
    T5 arg5,
    T6 arg6,
    T7 arg7,
    T8 arg8,
    T9 arg9,
    T10 arg10,
    T11 arg11
    )

    Trả lời
  4. Sau khi tham khảo trên MSDN thì từ khóa in này liên quan đến kĩ thuật contravariance và covariant. Đây là hai kĩ thuật mới trong .NET 4. Công dụng của nó gần giống với tính đa hình trong OOP nhưng ở đây là hỗ trợ cho các kiểu generic. in là từ khóa dùng để xác định contravariant và out cho covariant. Bạn có thể coi tại đây:

    http://msdn.microsoft.com/en-us/library/dd469484(VS.100).aspx
    http://msdn.microsoft.com/en-us/library/dd469487.aspx
    http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)

    Trả lời
  5. Xin chào Yin Yang
    Mnh đang thăc mắc không biết các thuộc tính AutoIncrement, AutoIncrementSeed, AutoIncrementStep của DataColumn dùng để làm gì, khi nào thì cần sử dụng.Bạn có thể vui lòng giúp mình được không? (mình coi trong MSDN thì chẳng hiểu gì vì tiếng Anh của mình í ẹ lắm).

    Trả lời
  6. – AutoIncrement: Khi bạn thêm 1 dòng mới vào bảng thì giá trị của cột này sẽ tự động tăng lên.
    – AutoIncrementSeed: Giá trị ban đầu của cột được set AutoIncrement. Ví dụ bạn gán = 10 thì giá trị tiếp theo sẽ được tính từ 10.
    – AutoIncrementStep: giá trị tăng tự động. Ví dụ nếu bạn đặt là 2 thì giá trị của cột sẽ là 2,4,6,8…

    Trả lời
  7. Câu hỏi của mình ngắn gọn, nhưng mình xin nói dài ra chút xíu, để YinYang có thể hiểu rõ hơn câu hỏi của mình.
    Kiến trúc 3 lớp là kiến trúc cơ bản nhất để xây dựng phần mềm hay ứng dụng Web.
    Bên lĩnh vực web, người ta có rất nhiều design pattern, ví dụ như MVC.
    Vậy bên lĩnh vực phần mềm, người ta có những mẫu design Pattern nào? Ưu nhược điểm của các design pattern đó? Design Pattern nào người ta thường áp dụng để viết phần mềm? Đối với winform/wpf, người ta hay áp dụng mô hình gì để phát triển ứng dụng?
    Mình thấy người ta phát triển phần mềm, thường dựa trên kiến trúc 3 lớp, và đối với tầng UI, người ta sử dụng mô hình code behind để gọi hàm xử lý. Viết như vậy mình thấy ok, nhưng gặp những ứng dụng lớn, thì mô hình code behind trở nên dở. Mình muốn tìm 1 mô hình gì đó gọi là tương đối chuẩn, dễ sử dụng như mô hình MVC mà mình biết.

    Trả lời
  8. Nói về MVC pattern thì bạn cũng có thể từng nghe nói đến hai design pattern là MVVM (Model-View-View Model) và MVP (Model-View-Presenter). Trong đó mô hình MVVM thường được dùng cho các ứng dụng WPF và Silverlight và MVP dành cho Windows Foms. Cả hai mô hình này đều dựa trên MVC nên bạn có thể dễ dàng tìm hiểu và áp dụng cho ứng dụng của mình.

    Trả lời
  9. Giả sử trong sự kiện Form_Load mình đọc và xuất ra Treeview trv như sau:

    Trường
    |
    —-Khối 6
    | |
    —–Lớp 61
    | |
    —–Lớp 62
    |
    —-Khối 7
    |
    —–Lớp 71
    |
    —–Lớp 72

    Mình muốn hỏi bạn là có cách nào để đồng thời tự động chọn được node Lớp 62 giống như khi mình click chuột chọn trên cây không? Mình dùng trv.SelectedNode = trv.Nodes(0).Nodes(0).Nodes(1) thì nó chọn được nhưng không node được chọn không hiện lên như khi ta Click chuột (tức là đổi màu nền và màu chữ của node được chọn)

    Trả lời
  10. Em có 1 cái tool ( thử nghiệm ) bằng winform, trên form chỉ có mỗi 1 cái Picturebox, Picturebox này em cho nó load 1 cái ảnh động.

    Đơn giản chí có nhiêu đó, mà khi đóng gói xong, em chạy thử và quan sát bằng Task manager của windows thì thấy nó chạy những 10 threads ( sau đó tầm 15s thì giảm xuống còn 8 threads ), và ngốn khoảng 7000K RAM.

    Có cách nào để chương trình khi chạy nó “nhẹ” hơn được không ạ?

    Trả lời
    • Theo cách thông thường thì bạn cần có một host cho phép lấy direct link để tải về tập tin chứa thông tin phiên bản. Khi đã tải được tập tin này, chỉ cần kiểm tra và download phiên bản mới. Phần này tương đối đơn giản, còn bước tiếp theo tùy thuộc vào cách bạn muốn cập nhật chương trình. Có hai trường hợp là tải về nguyên tập tin setup để cài đè lên phiên bản cũ hoặc chỉ cập nhật những thành phần cần thiết.

      Mình sẽ cân nhắc và giới thiệu phương pháp update dành riêng cho các dự án phát triển bằng Visual Studio sau.

      Trả lời
  11. Chào YinYang
    Hiện giờ mình đang giải quyết 1 vấn đề là khi mình tạo program có kèm theo 1 số file DLL. Khi mình debug thì VS sẽ tự động copy các file này vào folder bin cùng với program. Điều này khá bất tiện khi project của mình có khoảng > 10 file DLL (chủ yếu là file liên quan đến GUI, devexpress), folder bin sau đó nhìn rất loạn mắt, khi copy sang máy khác gây khó khăn cho người dùng. Mình muốn tạo 1 folder con bên cạnh (vd DLLS) rồi chỉnh cho soft load các file từ đó. Mình ko muốn tạo file setup vì 1 số lý do. Mình search trên mạng khá lâu nhưng chưa tìm đc cách giải. Mong ý kiến của bạn

    Trả lời
  12. Bạn chỉ cần tạo một file config trong thư mục chương trình. Ví dụ file chương trình của bạn là Test.exe, file config sẽ là Test.exe.config. Thư mục con bạn chứa các dll là lib1, lib2 thì bạn sẽ để nội dung của file config như sau:

    <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="lib1;lib2"/>
        </assemblyBinding>
      </runtime>
    </configuration>
    

    p/s: Các thư mục được ngăn cách bởi dấu ;

    Trả lời
  13. Mình đang làm 1 ứng dụng đồng bộ dữ liệu từ trên Server.
    Đầu tiên mình làm 1 nút Download:

    private void buttonDownload_Click(object sender, RoutedEventArgs e)
            {
                DownloadManager();
            }
    

    Trong hàm downloadManager, mình lấy danh sách file đang có ở trên server và thực hiện việc download về. (gồm nhiều thao tác như so sánh file đã có chưa, kiểm tra quyền hạn khi download)
    Mình cần add thêm 1 control là ProgressBar để hiển thị tình trạng download của tập tin.

    public void Download(string url)
            {
                //---Đoạn code download ở đây.
                //--- chèn thêm progressbar ở đây. Nhưng bị lỗi
            }
    

    Nhưng khi gọi ProgressBar ở trong file class DownloadManager thì nó báo lỗi. Vậy làm cách nào để nó có thể điều khiển được control ProgressBar ở trên giao diện

    Trả lời
  14. Mình giải thích ý trên, nói hơi dài và khó hiểu.
    Mình có 2 Project.
    Project 1: Lớp UI: chứa giao diện chương trình, và progressbar để hiển thị tốc độ download tập tin.
    Project 2: Logic Layer: Thực hiện việc kiểm tra logic hợp lệ và tiến hành download.
    Trong hàm download ở project LogicLayer, mình thực hiện việc databinding lên lớp UI. Việc databinding thực hiện được nhưng vướng 1 chỗ: Sau khi bấm nút download, dù đã được binding, nhưng phải cho đến khi thực hiện xong hàm download, giao diện mới được Refresh lại. Mình muốn mỗi lần thay đổi giá trị, nó tự động refresh lại giao diện.
    (Để thực hiện Databinding: mình cho lớp Settings thực hiện kế thừa từ lớp INotifyPropertyChanged)

    Trả lời
  15. Mình đang thắc mắc về cách dùng Enum trong C#. Giả sử có 3 enum:

    public enum Animal
    {
      dog = 0,
      cat = 1
    }
    
    private enum dog
    {
       bulldog = 0,
       greyhound = 1,
       husky = 3
    }
    
    private enum cat
    {
       persian = 0,
       siamese = 1,
       burmese = 2
    }
    

    Khi hiển thị trên các enum trên trang Insert (trang thêm thông tin) thì việc gọi enum vô cùng dễ dàng. Nhưng khi lưu xuống cơ sở dữ liệu: Ví dụ: người dùng chọn con vật là dog, giống husky , thì khi lưu xuống cơ sở dữ liệu, mình sẽ lưu type = 0, value 3.
    Và khi lấy dữ liệu từ database, show lên cho người dùng xem, mình có thể lấy được dễ dàng kiểu Animal.dog, nhưng để hiển thị ra loại husky, mình không thể lấy kiểu enum Dog rồi lấy các value ở trong đó.
    Vậy có cách nào để giải quyết không? Mình xin cám ơn bạn trước.

    Trả lời
  16. Xin YinYang 1 bài về cách Hook DirectX đc ko ?
    Mình đang muốn tìm hiểu về cái này. Mình muốn làm 1 app nho nhỏ đơn giản là draw số fps lên 1 game đang chạy fullscreen (dạng như phần mềm Fraps vậy). Mình search thấy muốn làm thế thì phải sử dụng hook DirectX nhưng mình thật sự ko biết bắt đầu học từ đâu😦
    Mong sự giúp đỡ của bạn !

    Trả lời
  17. YinYang mình hỏi chút. Ví dụ ta có event Click của 1 button sau :

    protected void Submit_Click (object sender, EventArgs e){
    Controls.Clear();
    Reponse.Write(” Name : ” + txtName.Text);
    }
    Method Clear() đã xóa các Controls , vậy sao ta vẫn có thể lấy ra txtName.Text của Textbox Name ?
    Method Clear() ( xóa hết ) và Remove() (xóa 1 ) có gì khác nhau không ? Hay là method Clear() tương ứng với RemoveAll ??

    Trả lời
  18. Xin chào Yin Yang!
    Mình đang xây dựng một tool vẽ hình cho phần mềm soạn bài giảng điện tử dùng htmleditor. Mình muốn xây dựng tool này bằng HTML5 canvas,
    (dùng Webbrow control để load trang html5 chứa mã javascript, jquery) sau khi vẽ xong sẽ chèn vào bài giảng. khó khăn mình gặp phải là không biết làm cách nào để chọn hình trên bài giảng để eidt nó. Yin Yang và mọi người có góp ý gì không?

    Trả lời
  19. anh cho em hoi vấn đề này hơi chủ quan 1 tí. theo anh thấy thì silverlight hiện giờ thì thế nào? có nên học silverlight không? xu hướng bây giờ mình nên theo cái gì chủ yếu? web của các ông lớn hay chơi với cộng đồng mã nguồn mở?

    Trả lời
  20. Chào Bạn!
    Bạn có thể giúp mình hiểu thêm về Virtual vs Abtract được không? Mình cũng có đọc các tài liệu tiếng anh, cũng hiểu phần nào nhưng vẫn chưa ngấm hết cái hay của nó! Cám ơn bạn !

    Trả lời
    • Bạn có thể xem bảng phân biệt hai loại phương thức này tại trang http://softwarecafeblog.blogspot.com/2011/05/abstract-vs-virtual-in-c.html. Mình paste lên đây cho tiện theo dõi.

      Abstract Virtual No Keyword
      Can have implementation?  No Yes Yes
      Can override? Must Can but not a must You can declare a new method with the same name
      Which keyword to use to provide new implementation in the concrete class? override override No keyword needed
      If an object is created of the base class type, which method will be executed? Concrete implementation The parent implementation will be called only if no implementation is provided in the concrete class Parent implementation
      If an object is created of the concrete class type, which method will be executed? Concrete implementation Concrete implementation The parent implementation will be called only if no implementation is provided in the concrete class
      Trả lời
  21. bạn YinYang có thể xem hộ mình đoạn code này không, mình đang muốn sử dụng action để end method mà action đó được gọi khi có thông báo 1 string, như thế này
    namespace ClassLibrary1
    {
    public class Class1
    {
    public Action EndOn;
    public Class1()
    {
    EndOn = new Action(type =>
    {
    OnNotify(type, () =>
    {
    // Làm cách nào để end method ngay lập tức, cụ thể trong ví dụ là LaucherHandler
    });
    });
    }

    void OnNotify(string type, Action handler)
    {
    // …
    // Các lệnh trong handler sẽ được thực thi khi trong laucher hoặc người dùng thông báo ‘type’
    }
    }

    class TestLaucher : Class1
    {
    void LaucherHandler()
    {
    EndOn(“laucher_disconnet”);
    }
    string GetLifetimeMatchName
    {
    EndOn(“laucher_disconnect”);
    EndOn(“match_end”);
    // Nếu EndOn được gọi, trả về null value
    }
    }
    }

    Trả lời
  22. mình cũng chả biết nữa😀 bạn chỉ mình cách để dừng 1 thread hoặc 1 method đang chạy bất cứ lúc nào cũng được không, mà phải là gọi ở nơi khác (như 1 thread khác), vì trong project của mình phải dừng ở nhiều nơi, không ở cho 1 đoạn code vào từng method cần dừng được
    Cám ơn bạn nhiều lắm🙂

    Trả lời
    • Bạn cần dùng array hay list? Nếu là List<List> bạn có thể xem ví dụ này:

      var list = new List<List<string>>();
      // sub list 0
      list.Add(new List<string>()
      {
          "a", "b", "c"
      });
      // sub list 1
      list.Add(new List<string>()
      {
          "d", "e", "f"
      });
      
      for (int i = 0; i < list.Count; i++)
      {
          Console.WriteLine("\nSub list " + i);
      
          foreach (var item in list[i])
          {
              Console.Write(item + ", ");
          }
      }
      

      Nếu là array bạn có thể tìm hiểu về jagged: http://www.dotnetperls.com/jagged-array

      Trả lời

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s