Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Kiểm tra tính đúng của dữ liệu trong textbox

  1. #1
    Ngày gia nhập
    10 2021
    Bài viết
    2

    Mặc định Kiểm tra tính đúng của dữ liệu trong textbox

    Cho mình hỏi cách để thực hiện yêu cầu sau:
    Giả sử mình có vài cái textbox, ví dụ: so_a, so_b, so_c...(Chỉ nhập số)
    Yêu cầu nếu nhập sai dữ liệu trong textbox (ví dụ như nhập cả số lẫn chữ) thì báo lỗi và không cho phép chuyển con trỏ soạn thảo sang textbox khác
    Bài tập mình phải làm trên windows forms app của visual studio

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    996

    Bạn có thể làm các bước sau:
    1. Xác định nơi lưu trữ tính đúng đắn của dữ liệu :
    . Có thể dùng biến bool cho từng TextBox : private bool so_a_Boolean = true;...
    . Hoặc lưu trữ trong thuộc tính đúng trong TextBox.Tag, khởi tạo đúng cho nó : so_a.Tag = true;...
    2. Khởi tạo dữ liệu trong bước 1 khi xử lý sự kiện Form.Load
    3. Chặn và xử lý sự kiện TextBox.TextChanged
    4. Chặn và xử lý sự kiện TextBox.Leave

    Mã ví dụ:

    Phần thiết kế có các TextBox so_a, so_b, so_c và 1 Label label1 để thông báo lỗi cho người sử dụng.

    Form1.cs
    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3.  
    4. namespace WindowsFormsApplication1
    5. {
    6.     public partial class Form1 : Form
    7.     {
    8.         public Form1()
    9.         {
    10.             InitializeComponent();
    11.         }
    12.         private void Form1_Load(object sender, EventArgs e)
    13.         {
    14.             so_a.Tag = true;
    15.             so_b.Tag = true;
    16.             so_c.Tag = true;
    17.             label1.Text = "";
    18.         }
    19.         private void so_a_TextChanged(object sender, EventArgs e)
    20.         {
    21.             textbox_TextChange(sender);
    22.         }
    23.         private void so_b_TextChanged(object sender, EventArgs e)
    24.         {
    25.             textbox_TextChange(sender);
    26.         }
    27.         private void so_c_TextChanged(object sender, EventArgs e)
    28.         {
    29.             textbox_TextChange(sender);
    30.         }
    31.         private void so_a_Leave(object sender, EventArgs e)
    32.         {
    33.             textbox_Leave(sender);
    34.         }
    35.         private void so_b_Leave(object sender, EventArgs e)
    36.         {
    37.             textbox_Leave(sender);
    38.         }
    39.         private void so_c_Leave(object sender, EventArgs e)
    40.         {
    41.             textbox_Leave(sender);
    42.         }
    43.         private void textbox_TextChange(object sender)
    44.         {
    45.             TextBox textbox = (TextBox)sender;
    46.             string text = textbox.Text;
    47.             // Xem một chuỗi rỗng là dữ liệu đúng
    48.             if (text.Length == 0)
    49.             {
    50.                 label1.Text = "";
    51.                 textbox.Tag = true;
    52.                 return;
    53.             }
    54.             // Thử chuyển đổi sang số nguyên, nếu không được thì thông báo cho người sử dụng
    55.             try
    56.             {
    57.                 textbox.Tag = false;
    58.                 Convert.ToInt32(text);
    59.                 textbox.Tag = true;
    60.                 label1.Text = "";
    61.             }
    62.             catch (InvalidCastException)
    63.             {
    64.                 label1.Text = "Ngoại lệ: InvalidCastException. Mời nhập lại";
    65.             }
    66.             catch (OverflowException)
    67.             {
    68.                 label1.Text = "Ngoại lệ: OverflowException. Mời nhập lại";
    69.             }
    70.             catch (FormatException)
    71.             {
    72.                 label1.Text = "Ngoại lệ: FormatException. Mời nhập lại";
    73.             }
    74.         }
    75.         private void textbox_Leave(object sender)
    76.         {
    77.             TextBox textbox = (TextBox)sender;
    78.             if ((bool)textbox.Tag == false)
    79.             {
    80.                 label1.Text = "Dữ liệu không hợp lệ, mời nhập lại.";
    81.                 textbox.Focus();
    82.             }
    83.         }
    84.     }
    85. }

    Bạn chú ý, đây chỉ là ví dụ chuyển đổi theo giới hạn số nguyên. Các vấn đề về chuỗi số dài vượt qua các kiểu dữ liệu số cần viết theo cách khác nằm ngoài đề tài này.
    .
    .

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		New Bitmap Image.png
Lần xem:	0
Size:		3.0 KB
ID:		74224

  3. #3
    Ngày gia nhập
    10 2021
    Bài viết
    1

    Em là người mới, em muốn hỏi các anh chị xem có cách nào cũng thực hiện được câu hỏi trên mà thêm yêu cầu là khi dữ liệu đang sai thì không thể kích hoạt các Form khác trong chương trình.
    Và nếu em muốn không cho kích hoạt các Form của chương trình khác thì phải làm sao ? Em có tìm trên Gu gồ mà không ra.

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    996

    Nếu mục tiêu của bạn như trên thì sao không xử lý tận gốc ? Nghĩa là người dùng không thể nhập chữ vào TextBox, chứ không phải là cho nhập rồi kiểm tra !!!

    Mã ví dụ: Sử dụng PInvoice theo System.Runtime.InteropServices

    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3. using System.Runtime.InteropServices;   // Sử dụng thêm không gian tên này
    4.  
    5. namespace WindowsFormsApplication1
    6. {
    7.     public partial class Form1 : Form
    8.     {
    9.         [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
    10.         private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);
    11.  
    12.         [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
    13.         private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);
    14.  
    15.         [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    16.         private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);
    17.  
    18.         [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
    19.         private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
    20.  
    21.         private static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
    22.         {
    23.             if (IntPtr.Size == 8)
    24.                 return GetWindowLongPtr64(hWnd, nIndex);
    25.             else
    26.                 return GetWindowLongPtr32(hWnd, nIndex);
    27.         }
    28.         private static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
    29.         {
    30.             if (IntPtr.Size == 8)
    31.                 return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    32.             else
    33.                 return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
    34.         }
    35.  
    36.         public Form1()
    37.         {
    38.             InitializeComponent();
    39.         }
    40.         private void Form1_Load(object sender, EventArgs e)
    41.         {
    42.             // Hằng : GWL_STYLE = -16
    43.             // Hằng : ES_NUMBER = 0X2000
    44.  
    45.             SetWindowLongPtr(new HandleRef(so_a, so_a.Handle), -16,
    46.              ((IntPtr)((int)GetWindowLongPtr(so_a.Handle, -16) | 0x2000)));
    47.  
    48.             SetWindowLongPtr(new HandleRef(so_b, so_b.Handle), -16,
    49.              ((IntPtr)((int)GetWindowLongPtr(so_b.Handle, -16) | 0x2000)));
    50.  
    51.             SetWindowLongPtr(new HandleRef(so_c, so_c.Handle), -16,
    52.              ((IntPtr)((int)GetWindowLongPtr(so_c.Handle, -16) | 0x2000)));
    53.         }
    54.     }
    55. }

    Khi người dùng nhập chữ thì sẽ nhận phản hồi như hình dưới

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		New Bitmap Image.png
Lần xem:	0
Size:		10.5 KB
ID:		74225
    .
    .

  5. #5
    Ngày gia nhập
    10 2021
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Bạn có thể làm các bước sau:
    1. Xác định nơi lưu trữ tính đúng đắn của dữ liệu :
    . Có thể dùng biến bool cho từng TextBox : private bool so_a_Boolean = true;...
    . Hoặc lưu trữ trong thuộc tính đúng trong TextBox.Tag, khởi tạo đúng cho nó : so_a.Tag = true;...
    2. Khởi tạo dữ liệu trong bước 1 khi xử lý sự kiện Form.Load
    3. Chặn và xử lý sự kiện TextBox.TextChanged
    4. Chặn và xử lý sự kiện TextBox.Leave

    Mã ví dụ:

    Phần thiết kế có các TextBox so_a, so_b, so_c và 1 Label label1 để thông báo lỗi cho người sử dụng.

    Form1.cs
    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3.  
    4. namespace WindowsFormsApplication1
    5. {
    6.     public partial class Form1 : Form
    7.     {
    8.         public Form1()
    9.         {
    10.             InitializeComponent();
    11.         }
    12.         private void Form1_Load(object sender, EventArgs e)
    13.         {
    14.             so_a.Tag = true;
    15.             so_b.Tag = true;
    16.             so_c.Tag = true;
    17.             label1.Text = "";
    18.         }
    19.         private void so_a_TextChanged(object sender, EventArgs e)
    20.         {
    21.             textbox_TextChange(sender);
    22.         }
    23.         private void so_b_TextChanged(object sender, EventArgs e)
    24.         {
    25.             textbox_TextChange(sender);
    26.         }
    27.         private void so_c_TextChanged(object sender, EventArgs e)
    28.         {
    29.             textbox_TextChange(sender);
    30.         }
    31.         private void so_a_Leave(object sender, EventArgs e)
    32.         {
    33.             textbox_Leave(sender);
    34.         }
    35.         private void so_b_Leave(object sender, EventArgs e)
    36.         {
    37.             textbox_Leave(sender);
    38.         }
    39.         private void so_c_Leave(object sender, EventArgs e)
    40.         {
    41.             textbox_Leave(sender);
    42.         }
    43.         private void textbox_TextChange(object sender)
    44.         {
    45.             TextBox textbox = (TextBox)sender;
    46.             string text = textbox.Text;
    47.             // Xem một chuỗi rỗng là dữ liệu đúng
    48.             if (text.Length == 0)
    49.             {
    50.                 label1.Text = "";
    51.                 textbox.Tag = true;
    52.                 return;
    53.             }
    54.             // Thử chuyển đổi sang số nguyên, nếu không được thì thông báo cho người sử dụng
    55.             try
    56.             {
    57.                 textbox.Tag = false;
    58.                 Convert.ToInt32(text);
    59.                 textbox.Tag = true;
    60.                 label1.Text = "";
    61.             }
    62.             catch (InvalidCastException)
    63.             {
    64.                 label1.Text = "Ngoại lệ: InvalidCastException. Mời nhập lại";
    65.             }
    66.             catch (OverflowException)
    67.             {
    68.                 label1.Text = "Ngoại lệ: OverflowException. Mời nhập lại";
    69.             }
    70.             catch (FormatException)
    71.             {
    72.                 label1.Text = "Ngoại lệ: FormatException. Mời nhập lại";
    73.             }
    74.         }
    75.         private void textbox_Leave(object sender)
    76.         {
    77.             TextBox textbox = (TextBox)sender;
    78.             if ((bool)textbox.Tag == false)
    79.             {
    80.                 label1.Text = "Dữ liệu không hợp lệ, mời nhập lại.";
    81.                 textbox.Focus();
    82.             }
    83.         }
    84.     }
    85. }

    Bạn chú ý, đây chỉ là ví dụ chuyển đổi theo giới hạn số nguyên. Các vấn đề về chuỗi số dài vượt qua các kiểu dữ liệu số cần viết theo cách khác nằm ngoài đề tài này.
    .
    .

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		New Bitmap Image.png
Lần xem:	0
Size:		3.0 KB
ID:		74224
    mình cảm ơn bạn! mình đã thử và làm được rồi ạ

    - - - Nội dung đã được cập nhật ngày 20-10-2021 lúc 08:53 PM - - -

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Nếu mục tiêu của bạn như trên thì sao không xử lý tận gốc ? Nghĩa là người dùng không thể nhập chữ vào TextBox, chứ không phải là cho nhập rồi kiểm tra !!!

    Mã ví dụ: Sử dụng PInvoice theo System.Runtime.InteropServices

    Visual C# Code:
    1. using System;
    2. using System.Windows.Forms;
    3. using System.Runtime.InteropServices;   // Sử dụng thêm không gian tên này
    4.  
    5. namespace WindowsFormsApplication1
    6. {
    7.     public partial class Form1 : Form
    8.     {
    9.         [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
    10.         private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);
    11.  
    12.         [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
    13.         private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);
    14.  
    15.         [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    16.         private static extern IntPtr GetWindowLongPtr32(IntPtr hWnd, int nIndex);
    17.  
    18.         [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
    19.         private static extern IntPtr GetWindowLongPtr64(IntPtr hWnd, int nIndex);
    20.  
    21.         private static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
    22.         {
    23.             if (IntPtr.Size == 8)
    24.                 return GetWindowLongPtr64(hWnd, nIndex);
    25.             else
    26.                 return GetWindowLongPtr32(hWnd, nIndex);
    27.         }
    28.         private static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
    29.         {
    30.             if (IntPtr.Size == 8)
    31.                 return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    32.             else
    33.                 return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
    34.         }
    35.  
    36.         public Form1()
    37.         {
    38.             InitializeComponent();
    39.         }
    40.         private void Form1_Load(object sender, EventArgs e)
    41.         {
    42.             // Hằng : GWL_STYLE = -16
    43.             // Hằng : ES_NUMBER = 0X2000
    44.  
    45.             SetWindowLongPtr(new HandleRef(so_a, so_a.Handle), -16,
    46.              ((IntPtr)((int)GetWindowLongPtr(so_a.Handle, -16) | 0x2000)));
    47.  
    48.             SetWindowLongPtr(new HandleRef(so_b, so_b.Handle), -16,
    49.              ((IntPtr)((int)GetWindowLongPtr(so_b.Handle, -16) | 0x2000)));
    50.  
    51.             SetWindowLongPtr(new HandleRef(so_c, so_c.Handle), -16,
    52.              ((IntPtr)((int)GetWindowLongPtr(so_c.Handle, -16) | 0x2000)));
    53.         }
    54.     }
    55. }

    Khi người dùng nhập chữ thì sẽ nhận phản hồi như hình dưới

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		New Bitmap Image.png
Lần xem:	0
Size:		10.5 KB
ID:		74225
    .
    .
    cái đò thì mình biết làm ạ, nhưng thầy yêu cầu làm như trên bài mình nói cơ

Tags của đề tài này

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