Xem kết quả thăm dò: Ý kiến của bạn về Control này

  • Dễ sử dụng, mẫu mã đẹp

    12 80.00%
  • Bình thường

    1 6.67%
  • Nhiều lỗi

    0 0%
  • Hướng dẫn kém

    1 6.67%
  • Code sơ xài

    1 6.67%
Bạn không thể bỏ phiếu ở thăm dò này
Số người bỏ phiếu 15.
Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: Tạo một Rating Control trong lập trình C#

  1. #1
    Ngày gia nhập
    09 2008
    Nơi ở
    Ở nhà chứ đâu... nhìn cái gì?!?!
    Bài viết
    218

    Thumbs up Tạo một Rating Control trong lập trình C#

    Chào các bạn,

    Hôm nay, Fox xin phép được trình bày cách xây dựng một Rating Windows Control nền dotNET 2.0 .



    Đã có code và demo cho bản RC1 (theo bản quyền GPL v3) các bạn tải về xem nhé

    I. GIỚI THIỆU
    Trong quá trình xây dựng phần mềm quản lý cho nhóm, đến module có tên "Chưng cầu dân ý", Fox muốn mọi thành viên trong nhóm cho điểm ý kiến đang xem xét. Nếu thể hiện bằng cách hiển thí String lên Label thì xoàng quá (Bọn trong nhóm dám nói ý kiến cũa Fox là "xoàng"). Lòng tự trọng khiến Fox lao vào Google, CodeProject nghiên cứu và tạo control này cho bọn chúng tâm phục khẩu phục )

    II. Ý TƯỞNG
    Qua nhiều lần lênh đênh trên mạng, Fox đã có được mục tiêu thực hiện. Có một số ý kiến dùng đồ họa trong C# vẽ hình, số khác thì dùng PictureBox... Fox sẽ gộp cả 2 ý kiến trên để thực hiện.
    1. Công cụ
    a. IDE dành cho C#: VS 2005, SharpDevelop 2.2 (nếu dùng SharpDevelop 3.0 thì phải cài dotNET 3.5).
    b. Phần mềm thiết kế ảnh (Ở đây Fox dùng PhotoShop CS2 để vẽ, XnView để chỉnh sửa ảnh).
    2. Lên kế hoạch
    a. Kiểu dáng: hình sao và hình trái tim (do đây là 2 hình phổ biến).
    b. Mức điểm tối thiểu là 0, tối đa là 5; cho phép hiển thị điểm + 0.5.
    c. Mỗi kiểu dáng cần tối thiểu 3 hình (hình nền chỉ có viền tim hoặc viền sao, hình một nửa quả tim hoặc một nửa ông sao, hình full tim hoặc full sao).
    d. Rating Control của Fox cho phép người dùng rê chuột trên nó, rê đến đâu thì hiển thị hình đến đó. Ví dụ rê 2 ông sao thì vẽ 2 ông sao full và 3 sao rỗng; rê đến 2 ông sao và một nửa ông sao thứ 3 thì vẽ 2 ông sao full, 1 nửa ông sao và 2 ông sao rỗng...
    e. Muốn chọn số điểm thích hợp thì chỉ việc click chuột ngay hình sao tại điểm rê cuối cùng. Ví dụ: theo ví dụ trên thì click chuột ở 2 ông sao diểm là 2.0; click chuột ngay một nữa ông sao thứ 3 thì số điểm là 2.5 ...
    f. Cho phép chỉ một lần hoặc nhiều lần rate.
    g. Khi một user khác rate tiếp nhưng chưa click chọn điểm thì khi rê chuột khỏi control thì vẫn hiện thị số sao và số điểm đã được rate lần trước; nếu chọn điểm luôn thì hiển thị số điểm hiện tại và số điểm trước đó.

    III. CODING
    1. Vẽ
    Fox sẽ up mẫu sao và tim minh họa cho các bạn, nếu các bạn không thích có thể tự thiết kế mẫu riêng cho mình . Ở đây fox dùng size 32x32 cho mục đích hướng dẫn, Fox khuyên nếu các bạn muốn áp dụng thực tế nên dùng cỡ 18x18 hoặc 24x24 là tốt nhất.
    2. Gõ
    a. Vào IDE new một project Class Library; trong project này new một UserControl (đặt tên tùy thích, ở đây Fox dùng tên RatingBar), sau đó switch UserControl này sang màn hình Coding (vì bạn không cần làm bất cứ thứ gì trên màn hình Designer cả).
    b. Khai báo một enum (bên ngoài Class) định dạng cho kiểu dáng của Control (theo mục a phần II.2 Lên kế hoạch)

    Visual C# Code:
    1. public enum IconStyle
    2. {
    3.     Star, // hình sao
    4.     Heart // hình trái tim
    5. }

    c. Trong class RatingBar fox khai báo 2 biến hằng (theo mục b phần II.2 Lên kế hoạch)

    Visual C# Code:
    1. public class RatingBar : UserControl
    2. {
    3. ...
    4.  
    5.     const byte ICON_DISTANCE = 1; // Khoãng cách giữa các hình
    6.     const byte MAX_ICONS = 5; // số điểm tối đa là 5.
    7.  
    8. ...
    9. }

    d. Khai báo các biến toàn cục, delegate, event


    Để thực hiện việc ghi nhận điểm, ta viết một Class sau

    Visual C# Code:
    1.  
    2. //Thực hiện mục g phần II.2 Lên kế hoạch
    3. public class RatingEventArgs : EventArgs
    4.     {
    5.         #region - field(s) -
    6.  
    7.         private float mCurrentRate;
    8.         private float mLastRate;
    9.  
    10.         #endregion
    11.  
    12.         public RatingEventArgs(float current, float last)
    13.         {
    14.             mCurrentRate = current;
    15.             mLastRate = last;
    16.         }
    17.  
    18.         public float CurrentRate
    19.         {
    20.             get { return mCurrentRate; }
    21.             set { mCurrentRate = value; }
    22.         }
    23.  
    24.         public float LastRate
    25.         {
    26.             get { return mLastRate; }
    27.             set { mLastRate = value; }
    28.         }
    29.     }
    30.  
    31. // Đăng ký sự kiện khi user bình chọn trên control.
    32. public delegate void OnRatingChangedEventHandler(object sender, RatingEventArgs e);
    33.  
    34. [DefaultEvent("RatingValueChanged")]
    35. public class RatingBar : UserControl
    36. {
    37. ...
    38.     // Sự kiện khi user bình chọn trên control
    39.     public event OnRatingChangedEventHandler RatingValueChanged;
    40.  
    41.     float mRating = 0; // biến quản lý số điểm dự tính bình chọn.
    42.     float mRatingHolder = 0; // biến quản lý số điểm đã bình chọn.
    43.        
    44.     bool mReadOnly = false; // cho phép xem không cho phép rate.
    45.     bool mRatingOnce = false; // Chỉ cho phép rate 1 lần.
    46.     bool mIsRated = false; // Kiểm tra đã rate hay chưa (dùng kèm với mRatingOnce).
    47.  
    48.     Image mEmptyIcon; // Quản lý hình viền tim hoặc viền sao.
    49.     Image mHalfIcon; // Quản lý hình nửa tim hoặc nửa sao.
    50.     Image mFullIcon; // Quản lý hình full tim hoặc full sao.
    51.  
    52.     IconStyle mIconStyle; // Kiểu dáng của control.
    53.  
    54.     PictureBox mContainerBar; // Canvas để vẽ
    55.  
    56. ...
    57. }

    e. Contructor

    Visual C# Code:
    1. public RatingBar()
    2. {
    3.       SetStyle(ControlStyles.SupportsTransparentBackColor, true); // cho phép có nền trong suốt.
    4.            
    5.       mContainerBar = new PictureBox();
    6.       mContainerBar.BackgroundImageLayout = ImageLayout.Center;
    7.       mContainerBar.MouseMove += new MouseEventHandler(ContainerBarOnMouseMoving); // Đăng kí sự kiện MouseMove (mục d phần II.2 Lên kế hoạch)
    8.       mContainerBar.MouseLeave += new EventHandler(ContainerBarOnMouseLeaving); // Đăng kí sự kiện MouseLeave (mục g phần II.2 Lên kế hoạch)
    9.       mContainerBar.MouseClick += new MouseEventHandler(ContainerBarOnMouseClicking); // Đăng kí sự kiện MouseClick (mục e phần II.2 Lên kế hoạch)
    10.       mContainerBar.Cursor = Cursors.Hand;
    11.       mContainerBar.Dock = DockStyle.Fill;
    12.  
    13.       this.BackColor = Color.Transparent;
    14.       this.Controls.Add(mContainerBar);
    15.       this.UpdateIcons();
    16.       this.UpdateControlSize();
    17.  
    18.       // draws empty icons first...
    19.       this.ReDraw();
    20. }

    f. Bỏ hình vào file Resource
    Các bạn mở file Resource của Rating Control (.resx) chọn Add Resource -> Add Exist File... và chọn các hình mẫu Fox gửi lên.

    g. Coding những events đã đăng kí cho PictureBox

    Visual C# Code:
    1. void ContainerBarOnMouseMoving(object sender, MouseEventArgs e)
    2.         {
    3.             if (mReadOnly || (mRatingOnce && mIsRated))
    4.                 return;
    5.            
    6.             Bitmap bitmap = new Bitmap(mContainerBar.Width, mContainerBar.Height);
    7.            
    8.             Graphics graphic = Graphics.FromImage(bitmap);
    9.            
    10.             int i = 0; // mốc hoành độ bắt đầu vẽ.
    11.            
    12.             float tempRating = 0;
    13.            
    14.             byte tempIconsCounter = MAX_ICONS; // temporary variable to hold the iconsCount value, because we're decreasing it on each loop
    15.            
    16.             for (int a = 0; a < MAX_ICONS; a++) // lần lượt vẽ 5 hình sao rỗng hoặc tim rỗng.
    17.             {
    18.                 if (e.X > i && e.X <= i + mEmptyIcon.Width / 2) // nếu rê đến những điểm một nửa sao hoặc nửa tim
    19.                 {
    20.                     graphic.DrawImage(mHalfIcon, i, 0, mEmptyIcon.Width, mEmptyIcon.Height);
    21.  
    22.                     i += ICON_DISTANCE + mEmptyIcon.Width;
    23.  
    24.                     tempRating += 0.5f;
    25.                 }
    26.                 else if (e.X > i) // rê trọn hình
    27.                 {
    28.                     graphic.DrawImage(mFullIcon, i, 0, mEmptyIcon.Width, mEmptyIcon.Height);
    29.  
    30.                     i += ICON_DISTANCE + mEmptyIcon.Width;
    31.                     tempRating += 1.0f;
    32.                 }
    33.                 else // rê qua 5 hình
    34.                     break;
    35.                
    36.                 tempIconsCounter--; //giảm số hình rỗng
    37.             }
    38.            
    39.             mRatingHolder = tempRating;
    40.            
    41.             this.DrawEmptyIcons(graphic, i, tempIconsCounter); // vẽ hình rỗng còn lại.
    42.            
    43.             graphic.Dispose();
    44.            
    45.             mContainerBar.BackgroundImage = bitmap; // hiển thị hình kết quả lên PictureBox
    46.         }
    47.        
    48.         void ContainerBarOnMouseLeaving(object sender, EventArgs e)
    49.         {
    50.             if (mReadOnly || (mRatingOnce && mIsRated))
    51.                 return;
    52.            
    53.             Bitmap bitmap = new Bitmap(mContainerBar.Width, mContainerBar.Height);
    54.            
    55.             Graphics graphic = Graphics.FromImage(bitmap);
    56.            
    57.             int i = 0;
    58.            
    59.             byte tempIconsCounter = MAX_ICONS;
    60.            
    61.             float tempRating = mRating;
    62.             while (tempRating > 0)
    63.             {
    64.                 if (tempRating > 0.5f)
    65.                 {
    66.                     graphic.DrawImage(mFullIcon, i, 0, mEmptyIcon.Width, mEmptyIcon.Height); // Draw icons with the dimension of iconEmpty, so that they do not look odd
    67.                     i += ICON_DISTANCE + mEmptyIcon.Width;
    68.                 }
    69.                 else if (tempRating == 0.5f)
    70.                 {
    71.                     graphic.DrawImage(mHalfIcon, i, 0, mEmptyIcon.Width, mEmptyIcon.Height); // Draw icons with the dimension of iconEmpty, so that they do not look odd
    72.                     i += ICON_DISTANCE + mEmptyIcon.Width;
    73.                 }
    74.                 else
    75.                     break;
    76.                
    77.                 tempIconsCounter--;
    78.                
    79.                 tempRating--;
    80.             }
    81.            
    82.             this.DrawEmptyIcons(graphic, i, tempIconsCounter);
    83.  
    84.             graphic.Dispose();
    85.            
    86.             mContainerBar.BackgroundImage = bitmap;
    87.         }
    88.        
    89.         void ContainerBarOnMouseClicking(object sender, MouseEventArgs e)
    90.         {
    91.             float tempOldRate = mRating;
    92.  
    93.             mRating = mRatingHolder;
    94.  
    95.             mIsRated = true;
    96.  
    97.             if (mRatingOnce)
    98.                 mContainerBar.Cursor = Cursors.Default;
    99.             if (RatingValueChanged != null && tempOldRate != mRating)
    100.                 RatingValueChanged(this, new RatingEventArgs(mRating, tempOldRate));
    101.         }

    h. Những method hỗ trợ

    Visual C# Code:
    1. void DrawEmptyIcons(Graphics g, int x, int count)
    2. {
    3.        for (byte a = 0; a < count; a++)
    4.        {
    5.              g.DrawImage(mEmptyIcon, x, 0, mEmptyIcon.Width, mEmptyIcon.Height);
    6.  
    7.              x += ICON_DISTANCE + mEmptyIcon.Width;
    8.        }
    9. }
    10.  
    11. // Lấy kích cở cho control
    12. void UpdateControlSize()
    13. {
    14.        int width = mEmptyIcon.Width * MAX_ICONS + (ICON_DISTANCE * (MAX_ICONS - 1));
    15.        int height = mEmptyIcon.Height;
    16.  
    17.        this.Size = new Size(width, height);
    18.        this.MaximumSize = new Size(width, height); // Không cho mở rộng control khi thiết kế *một bug chưa fix  hoàn chỉnh được
    19. }
    20.  
    21. // Khi chọn kiểu cho control
    22. void UpdateIcons()
    23. {
    24.       if (mIconStyle == IconStyle.Star)
    25.       {
    26.             mEmptyIcon = RatingBar_Resources.EmptyStar; //
    27.             mFullIcon = RatingBar_Resources.FullStar;        // lấy trong những file ảnh trong resource.
    28.             mHalfIcon = RatingBar_Resources.HalfStar;       //
    29.       }
    30.       else
    31.       {
    32.             mEmptyIcon = RatingBar_Resources.EmptyHeart;
    33.             mFullIcon = RatingBar_Resources.FullHeart;
    34.             mHalfIcon = RatingBar_Resources.HalfHeart;
    35.       }
    36.  
    37.       this.ReDraw(); // Vẽ lại nền
    38. }
    39.  
    40. /// <summary>
    41. /// Redraws empty-icons when choose another icon-style.
    42. /// </summary>
    43. private void ReDraw()
    44. {
    45.       Bitmap bitmap = new Bitmap(mContainerBar.Width, mContainerBar.Height);
    46.  
    47.       Graphics graphic = Graphics.FromImage(bitmap);
    48.  
    49.       this.DrawEmptyIcons(graphic, 0, MAX_ICONS);
    50.  
    51.       graphic.Dispose();
    52.  
    53.       mContainerBar.BackgroundImage = bitmap;
    54. }

    i. Properties dùng cho thiết kế

    Visual C# Code:
    1.  
    2.         public Image EmptyIcon
    3.         {
    4.             get { return mEmptyIcon; }
    5.         }
    6.        
    7.         public Image HalfIcon
    8.         {
    9.             get { return mHalfIcon; }
    10.         }
    11.        
    12.         public Image FullIcon
    13.         {
    14.             get { return mFullIcon; }
    15.         }
    16.  
    17.         [DefaultValue(false)]
    18.         public bool ReadOnly
    19.         {
    20.             get { return mReadOnly; }
    21.             set
    22.             {
    23.                 mReadOnly = value;
    24.  
    25.                 if (value)
    26.                     mContainerBar.Cursor = Cursors.Default;
    27.                 else
    28.                     mContainerBar.Cursor = Cursors.Hand;
    29.             }
    30.         }
    31.        
    32.         [DefaultValue(false)]
    33.         public bool RatingOnce
    34.         {
    35.             get { return mRatingOnce; }
    36.             set
    37.             {
    38.                 mRatingOnce = value;
    39.                
    40.                 if (!value) mContainerBar.Cursor = Cursors.Hand; /* Set hand cursor, if false is set from true*/ }
    41.         }
    42.        
    43.         [Browsable(false)]
    44.         public float Rate
    45.         {
    46.             get { return mRating; }
    47.         }
    48.  
    49.         public Color BarBackColor
    50.         {
    51.             get { return mContainerBar.BackColor; }
    52.             set { mContainerBar.BackColor = value; }
    53.         }
    54.  
    55.         [DefaultValue(typeof(IconStyle), "star")]
    56.         public IconStyle IconStyle // Chọn kiểu dáng cho control Tim hoặc Sao
    57.         {
    58.             get { return mIconStyle; }
    59.             set
    60.             {
    61.                 mIconStyle = value;
    62.                 UpdateIcons();
    63.             }
    64.         }

    Nhấn build project thôi

    IV. ÁP DỤNG
    Tạo một project Windows Form khác trong cùng Solution và Add Reference đến Project chứa Control của chúng ta. Tạo một Form sau đó vào màn hình thiết kế sẽ có một control tên RatingBar cho các bạn kéo thả vào form

    [old] Đáng tiết là Fox chưa thể up code cho các bạn (vài lý do tế nhị), chỉ có hướng dẫn và file demo và code cho Form thôi :(

    Đã up code và demo cho RC1 (theo bản quyền GPL v3).


    Nếu có gì thắc mắc hoặc phát hiện bug các bạn cứ trao đổi với Fox nhé.

    V. PHIÊN BẢN
    1. Ngày 20/03/2009:
    a. Fixing:
    _ Khi thay đổi property IconStyle từ Heart->Star và ngược lại sẽ vẽ lại lên PictureBox.
    _ Up code Beta 2
    b. Known bug:
    _ Chưa fix cho property AutoSize giống kiểu Label - dùng tạm property MaximumSize.
    _ Some unfix minor bugs...
    c. Things to do:
    _ Mặc định kiểu sao và kiểu tim (không cho user thay đổi resource)
    _ Sự kiện mặc định cho Control là RatingValueChanged (double-click vào Control sẽ tự động đăng ký)
    _ Fix minor bugs...

    2. Ngày 22/03/2009:
    a. Fixing:
    _ Mặc định kiểu sao và kiểu tim (không cho user thay đổi resource)
    _ Sự kiện mặc định cho Control là RatingValueChanged (double-click vào Control sẽ tự động đăng ký)
    _ Hỗ trợ màu nền trong suốt (Transparent).
    _ Fix minor bugs...
    _ Up to RC1 version (theo bản quyền GPL v3)

    c. Things to do:
    _ Thay đổi size của IconStyle cho control (16x16, 18x18, 24x24)
    _ Cho phép add control trên ToolStrip, MenuStrip hoặc StatusStrip trong quá trình design form.
    _ Fix minor bugs...
    _ Up to version 1.0.0 final.
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi OWickedFox : 22-03-2009 lúc 03:56 PM. Lý do: Update to RC1
    Quá nản cái viễn cảnh hiện tại. Nhiều "thanh niên" sống "ảo" quá. Thời nào rồi mà còn hỏi WinForms + ADO.NET

  2. #2
    Ngày gia nhập
    01 2010
    Bài viết
    7

    fox viết rất hay , cám ơn bạn nhiêu nha. mong bạn sẽ có những bài viết đóng góp hón nữa.

  3. #3
    Ngày gia nhập
    09 2008
    Nơi ở
    Ở nhà chứ đâu... nhìn cái gì?!?!
    Bài viết
    218

    gần 700 người vào đọc, có lẽ số người sử dụng qua Control này cũng nhiều, mà chả ai phát hiện bug hết sao 8-|? Nếu Control này Fox làm riêng không gộp vào frameworck chung thì giờ phiên bản sửa lỗi chắc lên v3.x rồi :-s

    Nếu các bạn hài lòng với bản này, chắc Fox hướng dẫn tạo lại Control trên bằng WPF i-) , cheer
    Quá nản cái viễn cảnh hiện tại. Nhiều "thanh niên" sống "ảo" quá. Thời nào rồi mà còn hỏi WinForms + ADO.NET

  4. #4
    Ngày gia nhập
    07 2010
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi OWickedFox Xem bài viết
    gần 700 người vào đọc, có lẽ số người sử dụng qua Control này cũng nhiều, mà chả ai phát hiện bug hết sao 8-|? Nếu Control này Fox làm riêng không gộp vào frameworck chung thì giờ phiên bản sửa lỗi chắc lên v3.x rồi :-s

    Nếu các bạn hài lòng với bản này, chắc Fox hướng dẫn tạo lại Control trên bằng WPF i-) , cheer
    ok bạn làm hướng dẫn bên WPF luôn nha

  5. #5
    Ngày gia nhập
    04 2009
    Bài viết
    175

    [DefaultEvent("RatingValueChanged")]
    [DefaultValue(false)]
    [Browsable(false)]
    Bạn có thể cho mình hỏi cách ý nghĩa của những dòng này ko? khi nào sử dụng? tại sao fai sử dụng nó? tra cứu nó ở đâu? Mong bạn giải thích giúp mình nhé. Mình còn kém trong lập trình lắm.

  6. #6
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    Mặc định Tạo một Rating Control trong lập trình C#

    Bạn search trên MSDN các class trên, thêm đuôi Attribute vào là ra:
    DefaultEvent: ví dụ khi double click vào một Button thì nó sẽ nhảy vào event gì, đó là công dụng của attribute này
    DefaultValue: dịch sang tiếng việt
    Browsable: cho phép property có hiển thị lên cửa sổ Properties ko
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

  7. #7
    Ngày gia nhập
    04 2009
    Bài viết
    175

    vậy mấy cái dòng dạng [...] đặt ở đầu phương thức nào đó là giống như 1 cái công tắc để cho phép phương thức đó được làm gì. không biết mình hiểu nôm na như j có đúng không

    cái phần [..("tên")] là mình tự đặt hay sao?
    Đã được chỉnh sửa lần cuối bởi xiaoku : 26-07-2011 lúc 12:17 PM.

  8. #8
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    như tên gọi của nó, đây là một dạng thuộc tính bổ sung thông tin cho method, class, property,... hiểu như bạn cũng được. Trong forum cũng có 1 số bài hướng dẫn, bạn tìm đọc để biết thêm chi tiết.
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

  9. #9
    Ngày gia nhập
    07 2009
    Nơi ở
    Tp.HCM
    Bài viết
    238

    Code hơi dài. Không cần sử dụng PictureBox và vẽ đi vẽ lại trong mousemove và mouseleave.Chỉ cần viết hàm vẽ, bắt sự kiện paint của control và vẽ ở trong đó. còn các hàm liên quan đến mouse chỉ tính toán tọa độ thôi,sau khi tính toán xong gọi Invalidate() để vẽ lại control.
    Mình chưa thấy bạn xử lý sự kiện Resize control. Nếu không xử lý sự kiện này, khi control resize (lúc đưa lên form rồi) thì mình nghĩ vẽ sẽ không chính xác nữa. (Chưa thử cái code của bạn: nếu có gì không đúng thì bỏ qua nhé.)
    Khi bạn cầm trên tay một món hàng Trung Quốc là bạn đang giúp Trung Quốc có thêm những viên đạn, những khẩu súng để bắn vào người Việt Nam.

  10. #10
    Ngày gia nhập
    09 2008
    Nơi ở
    Ở nhà chứ đâu... nhìn cái gì?!?!
    Bài viết
    218

    @Y2: Cám ơn bạn đã giúp đỡ giải thích các câu hỏi tại topic này, dạo này Fox bận quá ít vào CViet

    @itkttn: Cám ơn bạn đã góp ý, những ý kiến của bạn mình đã sửa và cập nhật từ lâu rồi. Nhưng nhưng bản cập nhật mình bỏ trên SVN server của công ty cũ rồi, nó là một trong những Control thuộc bộ lib mình phát triển cho họ... để bữa nào mình liên lạc họ để xin làm hướng dẫn trên CViet. Hy vọng họ đồng ý vì bữa có to tiếng với cha manager mới dẫn đến bức xúc nghĩ việc
    Quá nản cái viễn cảnh hiện tại. Nhiều "thanh niên" sống "ảo" quá. Thời nào rồi mà còn hỏi WinForms + ADO.NET

Các đề tài tương tự

  1. Tạo Rating của mỗi User cho mỗi Movie trong MVC 3
    Gửi bởi loveyounqa trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 25-03-2013, 03:53 PM
  2. sử dụng các control trong ajax extensions và ajax control toolkit trong cùng một trang
    Gửi bởi huynhvantoanblu trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 16-09-2012, 10:24 PM
  3. Algorithm Gọi CONTROL khi có được thuộc tính Name của Control Trong C#
    Gửi bởi markpq trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 29-03-2012, 08:22 AM
  4. Progress Control trong MFC- Xin hỏi kinh nghiệm dùng Progress Control?
    Gửi bởi keancaptinh trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 16-04-2009, 06:44 AM
  5. Hỏi về cách dùng control trong một lớp để điều khiển control trong lớp khác(VC++)
    Gửi bởi nhalaudixetau trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 18-04-2008, 04:18 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn