2009-09-30 29 views
14

Làm cách nào để ràng buộc một TextBox thành một số nguyên? Ví dụ: đơn vị liên kết với textBox1.C# - Ràng buộc TextBox thành một số nguyên

public partial class Form1 : Form 
{ 
    int unit; 

    public Form1() 
    { 
     InitializeComponent(); 


    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     textBox1.DataBindings.Add("Text", unit, "???"); 
    } 
+1

là Winforms này? – Natrium

+5

Nó xuất phát từ lớp Biểu mẫu. – rahul

Trả lời

21

Nó sẽ cần phải là tài sản công khai của một cá thể; trong trường hợp này, "này" sẽ đủ:

public int Unit {get;set;} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.DataBindings.Add("Text", this, "Unit"); 
} 

Đối với thông báo hai chiều, bạn sẽ cần một trong hai UnitChanged hoặc INotifyPropertyChanged:

private int unit; 
public event EventHandler UnitChanged; // or via the "Events" list 
public int Unit { 
    get {return unit;} 
    set { 
     if(value!=unit) { 
      unit = value; 
      EventHandler handler = UnitChanged; 
      if(handler!=null) handler(this,EventArgs.Empty); 
     } 
    } 
} 

Nếu bạn không muốn nó trên cộng đồng API, bạn có thể bọc nó trong một loại ẩn ở đâu đó:

class UnitWrapper { 
    public int Unit {get;set;} 
} 
private UnitWrapper unit = new UnitWrapper(); 
private void Form1_Load(object sender, EventArgs e) 
{ 
    textBox1.DataBindings.Add("Text", unit, "Unit"); 
} 

Đối với thông tin, các "sự kiện danh sách" những thứ đi một cái gì đó như:

01.
private static readonly object UnitChangedKey = new object(); 
    public event EventHandler UnitChanged 
    { 
     add {Events.AddHandler(UnitChangedKey, value);} 
     remove {Events.AddHandler(UnitChangedKey, value);} 
    } 
    ... 
    EventHandler handler = (EventHandler)Events[UnitChangedKey]; 
    if (handler != null) handler(this, EventArgs.Empty); 
+0

Marc, tôi không thể tìm thêm thông tin về mẹo đó khi bạn đặt tên sự kiện 'xxxChanged' cho thuộc tính' xxx' và sau đó nó được xử lý đằng sau cảnh. Bạn có thể đăng một liên kết hoặc ít nhất là cách lừa được gọi? Cảm ơn – pkuderov

+1

Đó là một phần của việc thực hiện PropertyDescriptor - về cơ bản nó tìm kiếm một mẫu của * Sự kiện đã thay đổi. Tuy nhiên, bạn cũng có thể sử dụng thủ thuật đặt tên thuộc tính INotifyPropertyChanged –

+0

khi lớp 'xxxAttribute' có thể được sử dụng sau đó vì chỉ' xxx' được viết bằng msdn. Nhưng hành vi này thực sự ẩn. Tôi đã cố gắng google một số thông tin thêm về nó nhưng không thành công (có thể vì từ 'thay đổi' câu đố tìm kiếm câu đố) :) anyway, thx lại – pkuderov

5

Bạn có thể sử dụng nguồn ràng buộc (xem nhận xét). Sự thay đổi đơn giản nhất là:

public partial class Form1 : Form 
{ 
    public int Unit { get; set; } 
    BindingSource form1BindingSource; 

    private void Form1_Load (...) 
    { 
     form1BindingSource.DataSource = this; 
     textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit"); 
    } 
} 

Tuy nhiên, bạn sẽ đạt được một số rõ ràng khái niệm nếu bạn tách ra các dữ liệu một chút:

public partial class Form1 : Form 
{ 
    class MyData { 
     public int Unit { get; set; } 
    } 

    MyData form1Data; 
    BindingSource form1BindingSource; 

    private void Form1_Load (...) 
    { 
     form1BindingSource.DataSource = form1Data; 
     textBox1.DataBindings.Add ("Text", form1BindingSource, "Unit"); 
    } 
} 

HTH. Đã bỏ qua các công cụ sửa đổi truy cập ghi chú.

+0

Thay đổi của Marc Gravell đơn giản và có vẻ tốt. Tôi có thói quen ràng buộc mọi thứ với các đối tượng BindingSource trên các nguyên tắc chung; nó ở đó, nó được xây dựng cho mục đích này, cũng có thể sử dụng nó. – XXXXX

+0

BindingSource hoạt động hoàn toàn như một mức trừu tượng; bạn có thể liên kết trực tiếp với cả hai trường hợp và danh sách. –

+0

Tôi không chắc chắn ý của bạn là gì * hoàn toàn * như một mức độ trừu tượng; có mã thực sự trong BindingSource thực hiện mọi thứ, chẳng hạn như quản lý tiền tệ. – XXXXX

4

Một trong những điều tôi muốn làm là tạo lớp "bản trình bày" cho biểu mẫu. Đó là trong lớp này mà tôi khai báo các thuộc tính được ràng buộc với các điều khiển trên biểu mẫu. Trong trường hợp này, điều khiển là một hộp văn bản.

Trong ví dụ này, tôi có một hình thức với một textbox để hiển thị một địa chỉ IP

enter image description here

Bây giờ chúng ta tạo ra các nguồn ràng buộc thông qua các thuộc tính textbox. Chọn DataBindings-> Text. Nhấp vào mũi tên xuống; chọn 'Thêm nguồn dữ liệu dự án'.

enter image description here

Điều này khởi động trình hướng dẫn Nguồn dữ liệu. Chọn Object. Nhấn 'Tiếp theo'.

enter image description here

Bây giờ chọn lớp mà có tài sản đó sẽ được bao bọc vào hộp văn bản. Trong ví dụ này, tôi đã chọn PNetworkOptions. Chọn Kết thúc để kết thúc trình hướng dẫn. BindingSource sẽ không được tạo.

enter image description here

Bước tiếp theo là chọn thuộc tính thực tế từ lớp ràng buộc. Từ DataBindings-> Text, chọn downarrow và chọn tên thuộc tính sẽ được liên kết với hộp văn bản.

enter image description here

Trong lớp đó có tài sản của bạn, INotifyPropertyChanged phải thực hiện để liên lạc 2 chiều cho IP Address lĩnh vực

public class PNetworkOptions : IBaseInterface, INotifyPropertyChanged 
{ 
    private string _IPAddress; 


    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    public string IPAddress 
    { 
     get { return _IPAddress; } 
     set 
     { 
      if (value != null && value != _IPAddress) 
      { 
       _IPAddress = value; 
       NotifyPropertyChanged("IPAddress"); 
      } 
     } 
    } 
} 

Trong constructor hình thức, chúng ta phải xác định cụ thể các ràng buộc

Binding IPAddressbinding = mskTxtIPAddress.DataBindings.Add("Text", _NetOptions, "IPAddress",true,DataSourceUpdateMode.OnPropertyChanged); 
Các vấn đề liên quan