Classe Binding
Assembly: System.Windows.Forms (in system.windows.forms.dll)
Utilizzare la classe Binding per creare e gestire un'associazione semplice tra la proprietà di un controllo e la proprietà di un oggetto o dell'oggetto corrente in un elenco di oggetti.
Come esempio del primo caso, è possibile associare la proprietà Text di un controllo TextBox alla proprietà FirstName di un oggetto Customer. Come esempio del secondo caso, è possibile associare la proprietà Text di un controllo TextBox alla proprietà FirstName di un oggetto DataTable in cui sono elencati i clienti.
La classe Binding consente inoltre di formattare i valori per la visualizzazione mediante l'evento Format e per il recupero dei valori formattati mediante l'evento Parse.
Quando si costruisce un'istanza Binding con il costruttore Binding, è necessario specificare tre elementi:
-
Il nome della proprietà del controllo a cui stabilire l'associazione.
-
L'origine dati.
-
Il percorso di spostamento che si risolve in un elenco o in una proprietà nell'origine dati. Il percorso di spostamento viene utilizzato anche per creare la proprietà BindingMemberInfo dell'oggetto.
Come prima cosa, è necessario specificare il nome della proprietà del controllo a cui si desidera associare i dati. Per visualizzare, ad esempio, i dati in un controllo TextBox, specificare la proprietà Text.
In secondo luogo, è possibile specificare un'istanza di una delle classi nella tabella riportata di seguito come origine dati:
| Descrizione | Esempio di codice C# |
|---|---|
| Qualunque classe che implementi IBindingList o ITypedList. Queste classi comprendono DataSet, DataTable, DataView e DataViewManager. |
DataSet ds = new DataSet("myDataSet");
|
| Qualunque classe che implementi IList per creare un insieme indicizzato di oggetti. L'insieme deve essere creato e compilato prima di creare l'oggetto Binding. Gli oggetti elencati devono essere tutti dello stesso tipo; in caso contrario, verrà generata un'eccezione. |
ArrayList ar1 = new ArrayList;
Customer1 cust1 = new Customer("Louis");
ar1.Add(cust1);
|
| IList fortemente tipizzato di oggetti fortemente tipizzati. |
Customer [] custList = new Customer[3]; |
Infine, è necessario specificare il percorso di spostamento, che può essere costituito da una stringa vuota (""), dal nome di una singola proprietà o da una gerarchia di nomi delimitata da punti. Se si imposta il percorso di spostamento su una stringa vuota, il metodo ToString viene chiamato sull'oggetto dell'origine dati sottostante.
Se l'origine dati è un controllo DataTable che può contenere più oggetti DataColumn, è necessario utilizzare il percorso di spostamento per ottenere una colonna specifica.
Nota |
|---|
| Quando l'origine dati è un controllo DataSet, DataViewManager o DataTable, si stabilisce in realtà un'associazione a un controllo DataView. Di conseguenza, le righe associate sono in realtà oggetti DataRowView. |
Un percorso di spostamento delimitato da punti è necessario quando l'origine dati è impostata su un oggetto che contiene più oggetti DataTable, ad esempio DataSet o DataViewManager. È anche possibile utilizzare un percorso di spostamento delimitato da punti quando si stabilisce un'associazione a un oggetto le cui proprietà restituiscono riferimenti ad altri oggetti, ad esempio una classe con proprietà che restituiscono altri oggetti di classe. Tutti i percorsi di spostamento seguenti descrivono, ad esempio, campi dati validi:
-
"Size.Height"
-
"Suppliers.CompanyName"
-
"Regions.regionsToCustomers.CustomerFirstName"
-
"Regions.regionsToCustomers.customersToOrders.ordersToDetails.Quantity"
Ciascun membro del percorso può restituire una proprietà che viene risolta in un valore singolo (ad esempio, un valore integer) o in un elenco di valori (ad esempio, una matrice di stringhe). Benché ciascun membro del percorso possa essere costituito da un elenco o una proprietà, il membro finale deve essere risolto in una proprietà. Ciascun membro viene generato sul membro precedente: "Size.Height" viene risolto nella proprietà Height dell'oggetto Size corrente; "Regions.regionsToCustomers.CustomerFirstName" viene risolto nel nome del cliente corrente, dove il cliente è uno dei clienti della regione corrente.
Un oggetto DataRelation restituisce un elenco di valori collegando un controllo DataTable a un secondo controllo DataTable in un DataSet. Se il DataSet contiene degli oggetti DataRelation, è possibile specificare il membro dati come proprietà TableName seguita da una proprietà RelationName e infine da una proprietà ColumnName. Se, ad esempio, il controllo DataTable denominato "Suppliers" contiene un oggetto DataRelation denominato "suppliers2products", il membro dati potrebbe essere "Suppliers.suppliers2products.ProductName".
L'origine dati può essere costituita da un gruppo di classi correlate. Si supponga, ad esempio, di disporre di un gruppo di classi per catalogare i sistemi solari. La classe denominata System contiene una proprietà denominata Stars che restituisce un insieme di oggetti Star. Ciascun oggetto Star dispone delle proprietà Name e Mass, nonché di una proprietà Planets che restituisce un insieme di oggetti Planet. In questo sistema, ciascun pianeta include anche le proprietà Mass e Name. Ciascun oggetto Planet dispone di un'ulteriore proprietà Moons che restituisce un insieme di oggetti Moon, ognuno dei quali dispone a sua volta delle proprietà Name e Mass. Se si specifica un oggetto System come origine dati, è possibile specificare come membro dati uno degli oggetti riportati di seguito:
-
"Stelle.Nome"
-
"Stelle.Massa"
-
"Stelle.Pianeti.Nome"
-
"Stelle.Pianeti.Massa"
-
"Stelle.Pianeti.Lune.Nome"
-
"Stelle.Pianeti.Lune.Massa"
I controlli a cui può essere stabilita un'associazione semplice includono un insieme di oggetti Binding in un insieme ControlBindingsCollection a cui è possibile accedere mediante la proprietà DataBindings del controllo. È possibile aggiungere un oggetto Binding all'insieme chiamando il metodo Add, quindi associando una proprietà del controllo a una proprietà di un oggetto o a una proprietà dell'oggetto corrente in un elenco.
È possibile stabilire un'associazione semplice a qualunque oggetto che derivi dalla classe System.Windows.Forms.Control, ad esempio i seguenti controlli di Windows:
-
TextBox
Nota |
|---|
| Solo la proprietà SelectedValue dei controlli ComboBox, CheckedListBox e ListBox viene associata in modo semplice. |
La classe BindingManagerBase è una classe astratta che consente di gestire tutti gli oggetti Binding per un'origine dati o un membro dati particolare. Le classi che derivano da BindingManagerBase sono le classi CurrencyManager e PropertyManager. Il modo in cui viene gestita la classe Binding dipende dal fatto che la classe Binding sia un'associazione di elenco o un'associazione di proprietà. Se, ad esempio, è un'associazione di elenco, è possibile utilizzare l'oggetto BindingManagerBase per specificare una proprietà Position nell'elenco; la proprietà Position determina pertanto quale elemento, tra tutti quelli presenti nell'elenco, è effettivamente associato a un controllo. Per restituire la classe BindingManagerBase appropriata, utilizzare BindingContext.
Per aggiungere una nuova riga a un gruppo di controlli associati alla stessa proprietà DataSource, utilizzare il metodo AddNew della classe BindingManagerBase. Utilizzare la proprietà Item della classe BindingContext per restituire la classe CurrencyManager appropriata. Per annullare l'aggiunta della una nuova riga, utilizzare il metodo CancelCurrentEdit.
Nell'esempio di codice riportato di seguito viene creato un Windows Form con diversi controlli che illustrano un'associazione dati semplice. Nell'esempio viene creato un controllo DataSet con due tabelle denominate Customers e Orders e un controllo DataRelation denominato custToOrders. I dati di quattro controlli (un controllo DateTimePicker e tre controlli TextBox) sono associati alle colonne delle tabelle. Per ciascun controllo viene creata e aggiunta una classe Binding mediante la proprietà DataBindings. Nell'esempio viene restituito un oggetto BindingManagerBase per ciascuna tabella mediante l'oggetto BindingContext del form. Quattro controlli Button consentono di aumentare o diminuire i valori della proprietà Position sugli oggetti BindingManagerBase.
using System; using System.Data; using System.Drawing; using System.Globalization; using System.Windows.Forms; public class Form1 : System.Windows.Forms.Form { private System.ComponentModel.Container components; private Button button1; private Button button2; private Button button3; private Button button4; private TextBox text1; private TextBox text2; private TextBox text3; private BindingManagerBase bmCustomers; private BindingManagerBase bmOrders; private DataSet ds; private DateTimePicker DateTimePicker1; public Form1() { // Required for Windows Form Designer support. InitializeComponent(); // Call SetUp to bind the controls. SetUp(); } private void InitializeComponent() { // Create the form and its controls. this.components = new System.ComponentModel.Container(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.text1= new System.Windows.Forms.TextBox(); this.text2= new System.Windows.Forms.TextBox(); this.text3= new System.Windows.Forms.TextBox(); this.DateTimePicker1 = new DateTimePicker(); this.Text = "Binding Sample"; this.ClientSize = new System.Drawing.Size(450, 200); button1.Location = new System.Drawing.Point(24, 16); button1.Size = new System.Drawing.Size(64, 24); button1.Text = "<"; button1.Click+=new System.EventHandler(button1_Click); button2.Location = new System.Drawing.Point(90, 16); button2.Size = new System.Drawing.Size(64, 24); button2.Text = ">"; button2.Click+=new System.EventHandler(button2_Click); button3.Location = new System.Drawing.Point(90, 100); button3.Size = new System.Drawing.Size(64, 24); button3.Text = "<"; button3.Click+=new System.EventHandler(button3_Click); button4.Location = new System.Drawing.Point(150, 100); button4.Size = new System.Drawing.Size(64, 24); button4.Text = ">"; button4.Click+=new System.EventHandler(button4_Click); text1.Location = new System.Drawing.Point(24, 50); text1.Size = new System.Drawing.Size(150, 24); text2.Location = new System.Drawing.Point(190, 50); text2.Size = new System.Drawing.Size(150, 24); text3.Location = new System.Drawing.Point(290, 150); text3.Size = new System.Drawing.Size(150, 24); DateTimePicker1.Location = new System.Drawing.Point(90, 150); DateTimePicker1.Size = new System.Drawing.Size(200, 800); this.Controls.Add(button1); this.Controls.Add(button2); this.Controls.Add(button3); this.Controls.Add(button4); this.Controls.Add(text1); this.Controls.Add(text2); this.Controls.Add(text3); this.Controls.Add(DateTimePicker1); } protected override void Dispose( bool disposing ){ if( disposing ){ if (components != null){ components.Dispose();} } base.Dispose( disposing ); } public static void Main() { Application.Run(new Form1()); } private void SetUp() { // Create a DataSet with two tables and one relation. MakeDataSet(); BindControls(); } protected void BindControls() { /* Create two Binding objects for the first two TextBox controls. The data-bound property for both controls is the Text property. The data source is a DataSet (ds). The data member is the "TableName.ColumnName" string. */ text1.DataBindings.Add(new Binding ("Text", ds, "customers.custName")); text2.DataBindings.Add(new Binding ("Text", ds, "customers.custID")); /* Bind the DateTimePicker control by adding a new Binding. The data member of the DateTimePicker is a TableName.RelationName.ColumnName string. */ DateTimePicker1.DataBindings.Add(new Binding("Value", ds, "customers.CustToOrders.OrderDate")); /* Add event delegates for the Parse and Format events to a new Binding object, and add the object to the third TextBox control's BindingsCollection. The delegates must be added before adding the Binding to the collection; otherwise, no formatting occurs until the Current object of the BindingManagerBase for the data source changes. */ Binding b = new Binding ("Text", ds, "customers.custToOrders.OrderAmount"); b.Parse+=new ConvertEventHandler(CurrencyStringToDecimal); b.Format+=new ConvertEventHandler(DecimalToCurrencyString); text3.DataBindings.Add(b); // Get the BindingManagerBase for the Customers table. bmCustomers = this.BindingContext [ds, "Customers"]; /* Get the BindingManagerBase for the Orders table using the RelationName. */ bmOrders = this.BindingContext[ds, "customers.CustToOrders"]; } private void DecimalToCurrencyString(object sender, ConvertEventArgs cevent) { /* This method is the Format event handler. Whenever the control displays a new value, the value is converted from its native Decimal type to a string. The ToString method then formats the value as a Currency, by using the formatting character "c". */ // The application can only convert to string type. if(cevent.DesiredType != typeof(string)) return; cevent.Value = ((decimal) cevent.Value).ToString("c"); } private void CurrencyStringToDecimal(object sender, ConvertEventArgs cevent) { /* This method is the Parse event handler. The Parse event occurs whenever the displayed value changes. The static ToDecimal method of the Convert class converts the value back to its native Decimal type. */ // Can only convert to decimal type. if(cevent.DesiredType != typeof(decimal)) return; cevent.Value = Decimal.Parse(cevent.Value.ToString(), NumberStyles.Currency, null); /* To see that no precision is lost, print the unformatted value. For example, changing a value to "10.0001" causes the control to display "10.00", but the unformatted value remains "10.0001". */ Console.WriteLine(cevent.Value); } private void button1_Click(object sender, System.EventArgs e) { // Go to the previous item in the Customer list. bmCustomers.Position -= 1; } private void button2_Click(object sender, System.EventArgs e) { // Go to the next item in the Customer list. bmCustomers.Position += 1; } private void button3_Click(object sender, System.EventArgs e) { // Go to the previous item in the Orders list. bmOrders.Position-=1; } private void button4_Click(object sender, System.EventArgs e) { // Go to the next item in the Orders list. bmOrders.Position+=1; } // Create a DataSet with two tables and populate it. private void MakeDataSet() { // Create a DataSet. ds = new DataSet("myDataSet"); // Create two DataTables. DataTable tCust = new DataTable("Customers"); DataTable tOrders = new DataTable("Orders"); // Create two columns, and add them to the first table. DataColumn cCustID = new DataColumn("CustID", typeof(int)); DataColumn cCustName = new DataColumn("CustName"); tCust.Columns.Add(cCustID); tCust.Columns.Add(cCustName); // Create three columns, and add them to the second table. DataColumn cID = new DataColumn("CustID", typeof(int)); DataColumn cOrderDate = new DataColumn("orderDate",typeof(DateTime)); DataColumn cOrderAmount = new DataColumn("OrderAmount", typeof(decimal)); tOrders.Columns.Add(cOrderAmount); tOrders.Columns.Add(cID); tOrders.Columns.Add(cOrderDate); // Add the tables to the DataSet. ds.Tables.Add(tCust); ds.Tables.Add(tOrders); // Create a DataRelation, and add it to the DataSet. DataRelation dr = new DataRelation ("custToOrders", cCustID , cID); ds.Relations.Add(dr); /* Populate the tables. For each customer and order, create two DataRow variables. */ DataRow newRow1; DataRow newRow2; // Create three customers in the Customers Table. for(int i = 1; i < 4; i++) { newRow1 = tCust.NewRow(); newRow1["custID"] = i; // Add the row to the Customers table. tCust.Rows.Add(newRow1); } // Give each customer a distinct name. tCust.Rows[0]["custName"] = "Alpha"; tCust.Rows[1]["custName"] = "Beta"; tCust.Rows[2]["custName"] = "Omega"; // For each customer, create five rows in the Orders table. for(int i = 1; i < 4; i++) { for(int j = 1; j < 6; j++) { newRow2 = tOrders.NewRow(); newRow2["CustID"]= i; newRow2["orderDate"]= new DateTime(2001, i, j * 2); newRow2["OrderAmount"] = i * 10 + j * .1; // Add the row to the Orders table. tOrders.Rows.Add(newRow2); } } } }
import System.*;
import System.Data.*;
import System.Drawing.*;
import System.Globalization.*;
import System.Windows.Forms.*;
public class Form1 extends System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private Button button1;
private Button button2;
private Button button3;
private Button button4;
private TextBox text1;
private TextBox text2;
private TextBox text3;
private BindingManagerBase bmCustomers;
private BindingManagerBase bmOrders;
private DataSet ds;
private DateTimePicker dateTimePicker1;
public Form1()
{
// Required for Windows Form Designer support.
InitializeComponent();
// Call SetUp to bind the controls.
SetUp();
} //Form1
private void InitializeComponent()
{
// Create the form and its controls.
this.components = new System.ComponentModel.Container();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.text1 = new System.Windows.Forms.TextBox();
this.text2 = new System.Windows.Forms.TextBox();
this.text3 = new System.Windows.Forms.TextBox();
this.dateTimePicker1 = new DateTimePicker();
this.set_Text("Binding Sample");
this.set_ClientSize(new System.Drawing.Size(450, 200));
button1.set_Location(new System.Drawing.Point(24, 16));
button1.set_Size(new System.Drawing.Size(64, 24));
button1.set_Text("<");
button1.add_Click(new System.EventHandler(button1_Click));
button2.set_Location(new System.Drawing.Point(90, 16));
button2.set_Size(new System.Drawing.Size(64, 24));
button2.set_Text(">");
button2.add_Click(new System.EventHandler(button2_Click));
button3.set_Location(new System.Drawing.Point(90, 100));
button3.set_Size(new System.Drawing.Size(64, 24));
button3.set_Text("<");
button3.add_Click(new System.EventHandler(button3_Click));
button4.set_Location(new System.Drawing.Point(150, 100));
button4.set_Size(new System.Drawing.Size(64, 24));
button4.set_Text(">");
button4.add_Click(new System.EventHandler(button4_Click));
text1.set_Location(new System.Drawing.Point(24, 50));
text1.set_Size(new System.Drawing.Size(150, 24));
text2.set_Location(new System.Drawing.Point(190, 50));
text2.set_Size(new System.Drawing.Size(150, 24));
text3.set_Location(new System.Drawing.Point(290, 150));
text3.set_Size(new System.Drawing.Size(150, 24));
dateTimePicker1.set_Location(new System.Drawing.Point(90, 150));
dateTimePicker1.set_Size(new System.Drawing.Size(200, 800));
this.get_Controls().Add(button1);
this.get_Controls().Add(button2);
this.get_Controls().Add(button3);
this.get_Controls().Add(button4);
this.get_Controls().Add(text1);
this.get_Controls().Add(text2);
this.get_Controls().Add(text3);
this.get_Controls().Add(dateTimePicker1);
} //InitializeComponent
protected void Dispose(boolean disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
super.Dispose(disposing);
} //Dispose
public static void main(String[] args)
{
Application.Run(new Form1());
} //main
private void SetUp()
{
// Create a DataSet with two tables and one relation.
MakeDataSet();
BindControls();
} //SetUp
protected void BindControls()
{
/* Create two Binding objects for the first two TextBox
controls. The data-bound property for both controls
is the Text property. The data source is a DataSet
(ds). The data member is the
"TableName.ColumnName" string.
*/
text1.get_DataBindings().Add(new Binding("Text", ds,
"customers.custName"));
text2.get_DataBindings().Add(new Binding("Text", ds,
"customers.custID"));
/* Bind the DateTimePicker control by adding a new Binding.
The data member of the DateTimePicker is a
TableName.RelationName.ColumnName string.
*/
dateTimePicker1.get_DataBindings().Add(new Binding("Value", ds,
"customers.CustToOrders.OrderDate"));
/* Add event delegates for the Parse and Format events to a
new Binding object, and add the object to the third
TextBox control's BindingsCollection. The delegates
must be added before adding the Binding to the
collection; otherwise, no formatting occurs until
the Current object of the BindingManagerBase for
the data source changes.
*/
Binding b = new Binding("Text", ds,
"customers.custToOrders.OrderAmount");
b.add_Parse(new ConvertEventHandler(CurrencyStringToDecimal));
b.add_Format(new ConvertEventHandler(DecimalToCurrencyString));
text3.get_DataBindings().Add(b);
// Get the BindingManagerBase for the Customers table.
bmCustomers = this.get_BindingContext().get_Item(ds, "Customers");
/* Get the BindingManagerBase for the Orders table using the
RelationName.
*/
bmOrders = this.get_BindingContext().get_Item(ds,
"customers.CustToOrders");
} //BindControls
private void DecimalToCurrencyString(Object sender, ConvertEventArgs cevent)
{
/* This method is the Format event handler. Whenever the
control displays a new value, the value is converted from
its native Decimal type to a string. The ToString method
then formats the value as a Currency, by using the
formatting character "c".
*/
// The application can only convert to string type.
if (!cevent.get_DesiredType().Equals(String.class.ToType())) {
return;
}
cevent.set_Value(((System.Decimal)(cevent.get_Value())).ToString("c"));
} //DecimalToCurrencyString
private void CurrencyStringToDecimal(Object sender, ConvertEventArgs cevent)
{
/* This method is the Parse event handler. The Parse event
occurs whenever the displayed value changes. The static
ToDecimal method of the Convert class converts the
value back to its native Decimal type.
*/
// Can only convert to decimal type.
if (!cevent.get_DesiredType().Equals(System.Decimal.class.ToType())) {
return;
}
cevent.set_Value(Decimal.Parse(cevent.get_Value().ToString(),
NumberStyles.Currency, null));
/* To see that no precision is lost, print the unformatted
value. For example, changing a value to "10.0001"
causes the control to display "10.00", but the
unformatted value remains "10.0001".
*/
Console.WriteLine(cevent.get_Value());
} //CurrencyStringToDecimal
protected void button1_Click(Object sender, System.EventArgs e)
{
// Go to the previous item in the Customer list.
bmCustomers.set_Position(bmCustomers.get_Position() - 1);
} //button1_Click
protected void button2_Click(Object sender, System.EventArgs e)
{
// Go to the next item in the Customer list.
bmCustomers.set_Position(bmCustomers.get_Position() + 1);
} //button2_Click
protected void button3_Click(Object sender, System.EventArgs e)
{
// Go to the previous item in the Orders list.
bmOrders.set_Position(bmOrders.get_Position() - 1);
} //button3_Click
protected void button4_Click(Object sender, System.EventArgs e)
{
// Go to the next item in the Orders list.
bmOrders.set_Position(bmOrders.get_Position() + 1);
} //button4_Click
// Create a DataSet with two tables and populate it.
private void MakeDataSet()
{
// Create a DataSet.
ds = new DataSet("myDataSet");
// Create two DataTables.
DataTable tCust = new DataTable("Customers");
DataTable tOrders = new DataTable("Orders");
// Create two columns, and add them to the first table.
DataColumn cCustID = new DataColumn("CustID", int.class.ToType());
DataColumn cCustName = new DataColumn("CustName");
tCust.get_Columns().Add(cCustID);
tCust.get_Columns().Add(cCustName);
// Create three columns, and add them to the second table.
DataColumn cID = new DataColumn("CustID", int.class.ToType());
DataColumn cOrderDate = new DataColumn("orderDate",
DateTime.class.ToType());
DataColumn cOrderAmount = new DataColumn("OrderAmount",
System.Decimal.class.ToType());
tOrders.get_Columns().Add(cOrderAmount);
tOrders.get_Columns().Add(cID);
tOrders.get_Columns().Add(cOrderDate);
// Add the tables to the DataSet.
ds.get_Tables().Add(tCust);
ds.get_Tables().Add(tOrders);
// Create a DataRelation, and add it to the DataSet.
DataRelation dr = new DataRelation("custToOrders", cCustID, cID);
ds.get_Relations().Add(dr);
/* Populate the tables. For each customer and order,
create two DataRow variables.
*/
DataRow newRow1;
DataRow newRow2;
// Create three customers in the Customers Table.
for (int i = 1; i < 4; i++) {
newRow1 = tCust.NewRow();
newRow1.set_Item("custID", (Int32)i);
// Add the row to the Customers table.
tCust.get_Rows().Add(newRow1);
}
// Give each customer a distinct name.
tCust.get_Rows().get_Item(0).set_Item("custName", "Alpha");
tCust.get_Rows().get_Item(1).set_Item("custName", "Beta");
tCust.get_Rows().get_Item(2).set_Item("custName", "Omega");
// For each customer, create five rows in the Orders table.
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 6; j++) {
newRow2 = tOrders.NewRow();
newRow2.set_Item("CustID", (Int32)i);
newRow2.set_Item("orderDate", new DateTime(2001, i, j * 2));
newRow2.set_Item("OrderAmount",
(System.Double)(i * 10 + j * 0.1));
// Add the row to the Orders table.
tOrders.get_Rows().Add(newRow2);
}
}
} //MakeDataSet
} //Form1
import System; import System.Data; import System.Drawing; import System.Globalization; import System.Windows.Forms; public class Form1 extends System.Windows.Forms.Form { private var components : System.ComponentModel.Container; private var button1 : Button; private var button2 : Button; private var button3 : Button; private var button4 : Button; private var text1 : TextBox; private var text2 : TextBox; private var text3 : TextBox; private var bmCustomers : BindingManagerBase; private var bmOrders : BindingManagerBase; private var ds : DataSet; private var DateTimePicker1 : DateTimePicker; public function Form1() { // Required for Windows Form Designer support. InitializeComponent(); // Call SetUp to bind the controls. SetUp(); } private function InitializeComponent() { // Create the form and its controls. this.components = new System.ComponentModel.Container(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.button3 = new System.Windows.Forms.Button(); this.button4 = new System.Windows.Forms.Button(); this.text1= new System.Windows.Forms.TextBox(); this.text2= new System.Windows.Forms.TextBox(); this.text3= new System.Windows.Forms.TextBox(); this.DateTimePicker1 = new DateTimePicker(); this.Text = "Binding Sample"; this.ClientSize = new System.Drawing.Size(450, 200); button1.Location = new System.Drawing.Point(24, 16); button1.Size = new System.Drawing.Size(64, 24); button1.Text = "<"; button1.add_Click(button1_Click); button2.Location = new System.Drawing.Point(90, 16); button2.Size = new System.Drawing.Size(64, 24); button2.Text = ">"; button2.add_Click(button2_Click); button3.Location = new System.Drawing.Point(90, 100); button3.Size = new System.Drawing.Size(64, 24); button3.Text = "<"; button3.add_Click(button3_Click); button4.Location = new System.Drawing.Point(150, 100); button4.Size = new System.Drawing.Size(64, 24); button4.Text = ">"; button4.add_Click(button4_Click); text1.Location = new System.Drawing.Point(24, 50); text1.Size = new System.Drawing.Size(150, 24); text2.Location = new System.Drawing.Point(190, 50); text2.Size = new System.Drawing.Size(150, 24); text3.Location = new System.Drawing.Point(290, 150); text3.Size = new System.Drawing.Size(150, 24); DateTimePicker1.Location = new System.Drawing.Point(90, 150); DateTimePicker1.Size = new System.Drawing.Size(200, 800); this.Controls.Add(button1); this.Controls.Add(button2); this.Controls.Add(button3); this.Controls.Add(button4); this.Controls.Add(text1); this.Controls.Add(text2); this.Controls.Add(text3); this.Controls.Add(DateTimePicker1); } protected override function Dispose(disposing : boolean){ if( disposing ){ if (components != null){ components.Dispose();} } super.Dispose( disposing ); } public static function Main() { Application.Run(new Form1()); } private function SetUp() { // Create a DataSet with two tables and one relation. MakeDataSet(); BindControls(); } protected function BindControls() { /* Create two Binding objects for the first two TextBox controls. The data-bound property for both controls is the Text property. The data source is a DataSet (ds). The data member is the "TableName.ColumnName" string. */ text1.DataBindings.Add(new Binding ("Text", ds, "customers.custName")); text2.DataBindings.Add(new Binding ("Text", ds, "customers.custID")); /* Bind the DateTimePicker control by adding a new Binding. The data member of the DateTimePicker is a TableName.RelationName.ColumnName string. */ DateTimePicker1.DataBindings.Add(new Binding("Value", ds, "customers.CustToOrders.OrderDate")); /* Add event delegates for the Parse and Format events to a new Binding object, and add the object to the third TextBox control's BindingsCollection. The delegates must be added before adding the Binding to the collection; otherwise, no formatting occurs until the Current object of the BindingManagerBase for the data source changes. */ var b : Binding = new Binding ("Text", ds, "customers.custToOrders.OrderAmount"); b.add_Parse(CurrencyStringToDecimal); b.add_Format(DecimalToCurrencyString); text3.DataBindings.Add(b); // Get the BindingManagerBase for the Customers table. bmCustomers = this.BindingContext [ds, "Customers"]; /* Get the BindingManagerBase for the Orders table using the RelationName. */ bmOrders = this.BindingContext[ds, "customers.CustToOrders"]; } private function DecimalToCurrencyString(sender, cevent : ConvertEventArgs) { /* This method is the Format event handler. Whenever the control displays a new value, the value is converted from its native Decimal type to a string. The ToString method then formats the value as a Currency, by using the formatting character "c". */ // The application can only convert to string type. if(cevent.DesiredType != String.GetType()) return; cevent.Value = (Decimal(cevent.Value)).ToString("c"); } private function CurrencyStringToDecimal(sender, cevent : ConvertEventArgs) { /* This method is the Parse event handler. The Parse event occurs whenever the displayed value changes. The static ToDecimal method of the Convert class converts the value back to its native Decimal type. */ // Can only convert to Decimal type. if(cevent.DesiredType != Decimal.GetType()) return; cevent.Value = Decimal.Parse(cevent.Value.ToString(), NumberStyles.Currency, null); /* To see that no precision is lost, print the unformatted value. For example, changing a value to "10.0001" causes the control to display "10.00", but the unformatted value remains "10.0001". */ Console.WriteLine(cevent.Value); } protected function button1_Click(sender, e : System.EventArgs) { // Go to the previous item in the Customer list. bmCustomers.Position -= 1; } protected function button2_Click(sender, e : System.EventArgs) { // Go to the next item in the Customer list. bmCustomers.Position += 1; } protected function button3_Click(sender, e : System.EventArgs) { // Go to the previous item in the Orders list. bmOrders.Position-=1; } protected function button4_Click(sender, e : System.EventArgs) { // Go to the next item in the Orders list. bmOrders.Position+=1; } // Create a DataSet with two tables and populate it. private function MakeDataSet() { // Create a DataSet. ds = new DataSet("myDataSet"); // Create two DataTables. var tCust : DataTable = new DataTable("Customers"); var tOrders : DataTable= new DataTable("Orders"); // Create two columns, and add them to the first table. var cCustID : DataColumn = new DataColumn("CustID", Int32); var cCustName : DataColumn = new DataColumn("CustName"); tCust.Columns.Add(cCustID); tCust.Columns.Add(cCustName); // Create three columns, and add them to the second table. var cID : DataColumn = new DataColumn("CustID", Int32); var cOrderDate : DataColumn = new DataColumn("orderDate", DateTime); var cOrderAmount : DataColumn = new DataColumn("OrderAmount", Decimal); tOrders.Columns.Add(cOrderAmount); tOrders.Columns.Add(cID); tOrders.Columns.Add(cOrderDate); // Add the tables to the DataSet. ds.Tables.Add(tCust); ds.Tables.Add(tOrders); // Create a DataRelation, and add it to the DataSet. var dr : DataRelation = new DataRelation ("custToOrders", cCustID , cID); ds.Relations.Add(dr); /* Populate the tables. For each customer and order, create two DataRow variables. */ var newRow1 : DataRow; var newRow2 : DataRow; // Create three customers in the Customers Table. for(var i : int = 1; i < 4; i++) { newRow1 = tCust.NewRow(); newRow1["custID"] = i; // Add the row to the Customers table. tCust.Rows.Add(newRow1); } // Give each customer a distinct name. tCust.Rows[0]["custName"] = "Alpha"; tCust.Rows[1]["custName"] = "Beta"; tCust.Rows[2]["custName"] = "Omega"; // For each customer, create five rows in the Orders table. for(var j : int = 1; j < 4; j++) { for(var k : int = 1; k < 6; k++) { newRow2 = tOrders.NewRow(); newRow2["CustID"]= j; newRow2["orderDate"]= new DateTime(2001, j, k * 2); newRow2["OrderAmount"] = j * 10 + k * .1; // Add the row to the Orders table. tOrders.Rows.Add(newRow2); } } } }
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile per Pocket PC, Windows Mobile per Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema.
Nota