2015-05-28 19 views
8

Tôi đã tạo một điều khiển NumericUpDown thập lục phân theo tiểu classing các NumericUpDown cơ bản và thêm các phương pháp sau đây:Tạo một điều khiển hệ thập lục phân NumericUpDown

protected override void UpdateEditText() 
{ 
    this.Text = "0x" + ((int) Value).ToString("X2"); 
} 

này hoạt động khá tốt. Việc kiểm soát hiện nay cho thấy giá trị trong các định dạng:

0x3F

đó là chính xác những gì tôi đã sau.

Nhưng có một điều làm tôi bực mình: mỗi khi chữ -property được gán, một System.FormatException được ném. Điều này dường như không ảnh hưởng đến chức năng của kiểm soát, nhưng tôi vẫn nghĩ nó xấu xí.

Đây là đỉnh của callstack:

MyAssembly.dll HexNumericUpDown.UpdateEditText() Dòng 31 C# System.Windows.Forms.dll System.Windows.Forms.NumericUpDown.ValidateEditText!() Unknown System.Windows.Forms.dll! System.Windows.Forms.UpDownBase.Text.set (string value) Unknown

tôi có thể chỉ cần bỏ qua ngoại lệ này? Hoặc là có một cách sạch sẽ để thoát khỏi điều này?

+0

Bạn có thể có điều gì đó đang chạy trên sự kiện TextChanged cố gắng chuyển đổi chuỗi trở lại thành một số nguyên không? – Jens

+0

"mỗi khi thuộc tính Văn bản được chỉ định, một System.FormatException được ném" nhưng ở đâu? Đăng stacktrace. –

+0

Xong. Tôi đã thêm dấu vết ngăn xếp. – Boris

Trả lời

6

Bạn cần ghi đè phương thức ValidateEditText() để bạn có thể xử lý đúng tiền tố (tùy chọn) "0x".Và ghi đè lên UpdateEditText() thành tiền tố "0x". Thêm một lớp mới vào dự án của bạn và dán mã được hiển thị bên dưới. Biên dịch. Thả điều khiển mới từ trên cùng của hộp công cụ lên biểu mẫu của bạn:

using System; 
using System.Windows.Forms; 

class HexUpDown : NumericUpDown { 
    public HexUpDown() { 
     this.Hexadecimal = true; 
    } 

    protected override void ValidateEditText() { 
     try { 
      var txt = this.Text; 
      if (!string.IsNullOrEmpty(txt)) { 
       if (txt.StartsWith("0x")) txt = txt.Substring(2); 
       var value = Convert.ToDecimal(Convert.ToInt32(txt, 16)); 
       value = Math.Max(value, this.Minimum); 
       value = Math.Min(value, this.Maximum); 
       this.Value = value; 
      } 
     } 
     catch { } 
     base.UserEdit = false; 
     UpdateEditText(); 
    } 

    protected override void UpdateEditText() { 
     int value = Convert.ToInt32(this.Value); 
     this.Text = "0x" + value.ToString("X4"); 
    } 
} 

Fwiw, thử nghiệm/bắt gặp tất cả đều xuất phát trực tiếp từ phiên bản .NET. Tôi giữ nó để làm cho kiểm soát hoạt động theo cùng một cách. Tinh chỉnh đối số ToString() theo cách bạn muốn.

0

Có một sự khác biệt giữa đúc và ConvertTo:

(int)obj - đây là một diễn viên rõ ràng của obj để kiểu int, bạn đang nói với trình biên dịch mà obj là một int. Nếu obj không phải là kiểu int, bạn sẽ nhận được một ngoại lệ cast. Nhưng nó không phải là REALLY một int. và định dạng X2 cần ints thực.

Convert.ToInt32(obj) - Đây là cuộc gọi rõ ràng đối với lớp Chuyển đổi để trả về một biểu tượng int int của obj.

Do đó bạn cần phải sử dụng Convert.ToInt32(Value)

NHƯNG trong MSDN nó nói:

1) API này (numericUpDown.Text) hỗ trợ .NET Framework cơ sở hạ tầng và không có ý định được sử dụng trực tiếp từ mã của bạn.

2) Văn bản không ảnh hưởng đến sự xuất hiện của điều khiển NumericUpDown ; do đó, nó được ẩn trong nhà thiết kế và từ IntelliSense.

+0

Điều đó không giải quyết vấn đề. Ngoại lệ xảy ra khi giá trị được gán cho văn bản thuộc tính. Việc int-casting không gây ra một ngoại lệ. – Boris

+0

this.Text, "this" là gì? –

+0

Đây là điều khiển NumericUpDown. – Boris

0

Tôi đoán bạn cũng cần phải ghi đè lên các phương pháp ParseEditText ValidateEditText, để chấp nhận các giá trị hex và thiết lập thuộc tính giá trị gia tăng với giá trị int đúng.

+0

'ParseEditText' không phải là ảo nhưng ValidateEditText là –

Các vấn đề liên quan