A
download Binding.cs
Language: C#
License: GPL
Copyright: (C) 2003 Southern Storm Software, Pty Ltd.
LOC: 215
Project Info
DotGNU Portable.NET(dotgnu-pnet)
Server: Savannah GNU
Type: cvs
...etlib\System.Windows.Forms\
   .cvsignore
   AccessibleEvents.cs
   AccessibleNavigation.cs
   AccessibleObject.cs
   AccessibleRole.cs
   AccessibleSelection.cs
   AccessibleStates.cs
   ActivationGesture.cs
   ActivationState.cs
   AmbientProperties.cs
   AnchorStyles.cs
   Appearance.cs
   Application.cs
   ApplicationContext.cs
   ArrangeDirection.cs
   ArrangeStartingPosition.cs
   BaseCollection.cs
   Binding.cs
   BindingContext.cs
   BindingManagerBase.cs
   BindingMemberInfo.cs
   BindingsCollection.cs
   BootMode.cs
   Border3DSide.cs
   Border3DStyle.cs
   BorderStyle.cs
   BoundsSpecified.cs
   Button.cs
   ButtonBase.cs
   ButtonBorderStyle.cs
   ButtonBoxLayout.cs
   ButtonState.cs
   CancelEventArgs.cs
   CancelEventHandler.cs
   CaptionButton.cs
   CharacterCasing.cs
   CheckBox.cs
   CheckListBox.cs
   CheckState.cs
   Clipboard.cs
   ColorDepth.cs
   ColorDialog.cs
   ColumnClickEventArgs.cs
   ColumnClickEventHandler.cs
   ColumnHeader.cs
   ColumnHeaderStyle.cs
   ComboBox.cs
   ComboBoxStyle.cs
   CommonDialog.cs
   ContainerControl.cs
   ...entsResizedEventArgs.cs
   ...sResizedEventHandler.cs
   ContextMenu.cs
   Control.cs
   ...olBindingsCollection.cs
   ControlEventArgs.cs
   ControlEventHandler.cs
   ControlPaint.cs
   ControlStyles.cs
   ControlToolkitMgr.cs
   ConvertEventArgs.cs
   ConvertEventHandler.cs
   CreateParams.cs
   CurrencyManager.cs
   Cursor.cs
   CursorConverter.cs
   Cursors.cs
   DataFormats.cs
   DataGrid.cs
   DataGridBoolColumn.cs
   DataGridCell.cs
   DataGridColumnStyle.cs
   DataGridLineStyle.cs
   ...ParentRowsLabelStyle.cs
   ...mnWidthTypeConverter.cs
   DataGridTableStyle.cs
   DataGridTextBox.cs
   DataGridTextBoxColumn.cs
   DataObject.cs
   DateBoldEventArgs.cs
   DateBoldEventHandler.cs
   DateRangeEventArgs.cs
   DateRangeEventHandler.cs
   DateTimePickerFormat.cs
   Day.cs
   DialogResult.cs
   DockStyle.cs
   DomainUpDown.cs
   DragAction.cs
   DragDropEffects.cs
   DragEventArgs.cs
   DragEventHandler.cs
   DrawItemEventArgs.cs
   DrawItemEventHandler.cs
   DrawItemState.cs
   DrawMode.cs
   ErrorBlinkStyle.cs
   ErrorIconAlignment.cs
   ErrorProvider.cs
   EventId.cs
   FeatureSupport.cs
   FileDialog.cs
   FlatStyle.cs
   FolderBrowserDialog.cs
   FontDialog.cs
   Form.cs
   FormBorderStyle.cs
   Forms.build
   FormStartPosition.cs
   FormWindowState.cs
   FrameStyle.cs
   GiveFeedbackEventArgs.cs
   ...FeedbackEventHandler.cs
   ...lumnStylesCollection.cs
   GridItem.cs
   GridItemCollection.cs
   GridItemType.cs
   GridLayout.cs
   ...ableStylesCollection.cs
   GroupBox.cs
   HBoxLayout.cs
   Help.cs
   HelpEventArgs.cs
   HelpEventHandler.cs
   HelpNavigator.cs
   HelpProvider.cs
   HorizontalAlignment.cs
   HScrollBar.cs
   IBindableComponent.cs
   IButtonControl.cs
   ICommandExecutor.cs
   ...ponentEditorPageSite.cs
   IContainerControl.cs
   ...gNotificationService.cs
   IDataGridEditingService.cs
   IDataObject.cs
   IDropTarget.cs
   IFeatureSupport.cs
   IFileReaderService.cs
   ImageIndexConverter.cs
   ImageList.cs
   ImageListStreamer.cs
   ImeMode.cs
   IMessageFilter.cs
   InputLanguage.cs
   ...uageChangedEventArgs.cs
   ...eChangedEventHandler.cs
   ...ageChangingEventArgs.cs
   ...ChangingEventHandler.cs
   InvalidateEventArgs.cs
   InvalidateEventHandler.cs
   IRecommendedSize.cs
   ItemActivation.cs
   ItemBoundsPortion.cs
   ItemChangedEventArgs.cs
   ItemChangedEventHandler.cs
   ItemCheckEventArgs.cs
   ItemCheckEventHandler.cs
   ItemDragEventArgs.cs
   ItemDragEventHandler.cs
   IWin32Window.cs
   IWindowTarget.cs
   KeyEventArgs.cs
   KeyEventHandler.cs
   KeyPressEventArgs.cs
   KeyPressEventHandler.cs
   Keys.cs
   Label.cs
   LabelEditEventArgs.cs
   LabelEditEventHandler.cs
   LayoutEventArgs.cs
   LayoutEventHandler.cs
   LeftRightAlignment.cs
   LinkArea.cs
   LinkBehavior.cs
   LinkClickedEventArgs.cs
   LinkClickedEventHandler.cs
   LinkLabel.cs
   ...LinkClickedEventArgs.cs
   ...kClickedEventHandler.cs
   LinkState.cs
   ListBindingConverter.cs
   ListBox.cs
   ListControl.cs
   ListView.cs
   ListViewAlignment.cs
   ListViewItem.cs
   ListViewItemConverter.cs
   ...ViewSubItemConverter.cs
   MainMenu.cs
   Makefile.am
   MdiClient.cs
   MdiLayout.cs
   MeasureItemEventArgs.cs
   MeasureItemEventHandler.cs
   Menu.cs
   MenuGlyph.cs
   MenuItem.cs
   MenuMerge.cs
   Message.cs
   MessageBox.cs
   MessageBoxButtons.cs
   MessageBoxDefaultButton.cs
   MessageBoxIcon.cs
   MessageBoxOptions.cs
   MethodInvoker.cs
   MonthCalendar.cs
   MouseButtons.cs
   MouseEventArgs.cs
   MouseEventHandler.cs
   NativeWindow.cs
   NavigateEventArgs.cs
   NavigateEventHandler.cs
   NodeLabelEditEventArgs.cs
   ...abelEditEventHandler.cs
   NotifyIcon.cs
   NumericUpDown.cs
   OpenFileDialog.cs
   Orientation.cs
   OSFeature.cs
   OwnerDrawPropertyBag.cs
   PaintEventArgs.cs
   PaintEventHandler.cs
   Panel.cs
   PictureBox.cs
   PictureBoxSizeMode.cs
   PopupControl.cs
   PrintDialog.cs
   ProgressBar.cs
   PropertySort.cs
   ...yTabChangedEventArgs.cs
   ...bChangedEventHandler.cs
   ...alueChangedEventArgs.cs
   ...eChangedEventHandler.cs
   ...ccessibilityHelpArgs.cs
   ...lityHelpEventHandler.cs
   ...ontinueDragEventArgs.cs
   ...inueDragEventHandler.cs
   RadioButton.cs
   RichTextBox.cs
   RichTextBoxFinds.cs
   RichTextBoxScrollBars.cs
   ...oxSelectionAttribute.cs
   ...extBoxSelectionTypes.cs
   RichTextBoxStreamType.cs
   ...tBoxWordPunctuations.cs
   RightToLeft.cs
   S.cs
   SaveFileDialog.cs
   Screen.cs
   ScrollableControl.cs
   ScrollBar.cs
   ScrollBars.cs
   ScrollButton.cs
   ScrollEventArgs.cs
   ScrollEventHandler.cs
   ScrollEventType.cs
   SecurityIDType.cs
   ...ItemChangedEventArgs.cs
   ...mChangedEventHandler.cs
   SelectionMode.cs
   Shortcut.cs
   SizeGripStyle.cs
   SortOrder.cs
   Splitter.cs
   SplitterEventArgs.cs
   SplitterEventHandler.cs
   StatusBar.cs
   ...BarDrawItemEventArgs.cs
   ...DrawItemEventHandler.cs
   StatusBarPanel.cs
   StatusBarPanelAutoSize.cs
   ...sBarPanelBorderStyle.cs
   ...rPanelClickEventArgs.cs
   ...nelClickEventHandler.cs
   StatusBarPanelStyle.cs
   StructFormat.cs
   SystemInformation.cs
   TabAlignment.cs
   TabAppearance.cs
   TabControl.cs
   TabDrawMode.cs
   TabPage.cs
   TabSizeMode.cs
   TextBox.cs
   TextBoxBase.cs
   TickStyle.cs
   Timer.cs
   TODOAttribute.cs
   ToolBar.cs
   ToolBarAppearance.cs
   ToolBarButton.cs
   ...ButtonClickEventArgs.cs
   ...tonClickEventHandler.cs
   ToolBarButtonStyle.cs
   ToolBarTextAlign.cs
   ToolTip.cs
   TrackBar.cs
   TreeNode.cs
   TreeNodeCollection.cs
   TreeView.cs
   TreeViewAction.cs
   TreeViewCancelEventArgs.cs
   ...ewCancelEventHandler.cs
   TreeViewEventArgs.cs
   TreeViewEventHandler.cs
   TriangleDirection.cs
   UICues.cs
   UICuesEventArgs.cs
   UICuesEventHandler.cs
   UpDownBase.cs
   UpDownEventArgs.cs
   UpDownEventHandler.cs
   UserControl.cs
   VBoxLayout.cs
   View.cs
   VScrollBar.cs
   Win32Constants.cs

/*
 * Binding.cs - Implementation of the
 *			"System.Windows.Forms.Binding" class.
 *
 * Copyright (C) 2003  Southern Storm Software, Pty Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

namespace System.Windows.Forms
{

using System.ComponentModel;
using System.Reflection;
#if !CONFIG_COMPACT_FORMS || CONFIG_COMPONENT_MODEL || CONFIG_EXTENDED_DIAGNOSTICS
[TypeConverter(typeof(ListBindingConverter))]
#endif // !CONFIG_COMPACT_FORMS || CONFIG_COMPONENT_MODEL || CONFIG_EXTENDED_DIAGNOSTICS
public class Binding
{
	// Internal state.
	private String propertyName;
	private Object dataSource;
	internal BindingManagerBase bindingManagerBase;
	private BindingMemberInfo bindingMemberInfo;
	private Control control;
	private bool isBinding;
	private Object dataSourceData;
	
	// Constructor.
	public Binding(String propertyName, Object dataSource, String dataMember)
			{
				this.propertyName = propertyName;
				this.dataSource = dataSource;
				this.bindingMemberInfo = new BindingMemberInfo(dataMember);

			}

	// Get this object's properties.
	public BindingManagerBase BindingManagerBase
			{
				get
				{
					return bindingManagerBase;
				}
			}
	public BindingMemberInfo BindingMemberInfo
			{
				get
				{
					return bindingMemberInfo;
				}
			}
	public Control Control
			{
				get
				{
					return control;
				}
			}
	public Object DataSource
			{
				get
				{
					return dataSource;
				}
			}
	internal Object DataSourceData
			{
				get
				{	
					return dataSourceData;
				}
				set
				{
					dataSourceData = value; 
				}
			}
	public bool IsBinding
			{
				get
				{
					return isBinding;
				}
			}
	[DefaultValue("")]
	public String PropertyName
			{
				get
				{
					return propertyName;
				}
			}

	// Associate a control with this binding.
	internal void AssociateControl(Control control)
			{
				this.control = control;
			}

	// Event that is raised when a property's value is bound.
	public event ConvertEventHandler Format;

	// Event that is raised when a property is changed.
	public event ConvertEventHandler Parse;

	// Raise the "Format" event.
	protected virtual void OnFormat(ConvertEventArgs e)
			{
				if(Format != null)
				{
					Format(this, e);
				}
			}

	// Raise the "Parse" event.
	protected virtual void OnParse(ConvertEventArgs e)
			{
				if(Parse != null)
				{
					Parse(this, e);
				}
			}

	internal void UpdateSource(Object data)
			{
				Type sourceType = this.DataSource.GetType();
				PropertyInfo setInfo;
				/* Usually System.Data Objects */
				if( sourceType.GetInterface("IListSource") != null )
				{
					if(sourceType.ToString() == "System.Data.DataSet")
					{
						/* TODO: Handle DataSet walking so we can
						 * write to datasets =) */
						Object itemTableVal = GetTableData(this.BindingMemberInfo.BindingPath, this.DataSource );
						SetRowData(data, this.BindingMemberInfo.BindingField, itemTableVal, 0 );
					}
					else if(sourceType.ToString() == "System.Data.DataTable")
					{
						SetRowData(data, this.BindingMemberInfo.BindingField, this.DataSource, 0 );
					}
				}
				else /* Default Simple Object */
				{
					if( this.BindingMemberInfo.BindingFieldType != null )
						setInfo = sourceType.GetProperty( this.BindingMemberInfo.BindingField,
							this.BindingMemberInfo.BindingFieldType );
					else
						setInfo = sourceType.GetProperty( this.BindingMemberInfo.BindingField);

					setInfo.SetValue(this.DataSource, data, null);
				}
	
			}
	
	private void SetRowData(Object data, Object field, Object datatable, int rowid)
	{
		if( field == null )
			throw new ArgumentNullException("Field");

		if( datatable == null )
			throw new ArgumentNullException("DataTable");

		if( rowid < 0 )
			throw new ArgumentOutOfRangeException("RowID");

		Type t = datatable.GetType();
		PropertyInfo sInfo = t.GetProperty("Rows");
		Object rowVal = sInfo.GetValue(datatable, null);
		t = rowVal.GetType();
		/* TODO: FIX ME, get the first row? */
		sInfo = t.GetProperty("Item", new Type[] {
				Type.GetType("System.Int32") } );
		Object itemRowVal = sInfo.GetValue(rowVal, new object[] { rowid } );

		t = itemRowVal.GetType();
		sInfo = t.GetProperty("Item", new Type[] { Type.GetType("System.String") });
		sInfo.SetValue(itemRowVal, data, new object[] { field } );
		
	}
	
	private Object GetRowData(Object field, Object datatable, int rowid)
	{
		Type t;
		PropertyInfo sInfo;
		Object rowVal, itemRowVal, sVal;
		
		if( field == null )
			throw new ArgumentNullException(S._("Field"));

		if( datatable == null )
			throw new ArgumentNullException(S._("DataTable"));

		if( rowid < 0 )
			throw new ArgumentOutOfRangeException(S._("RowID"));

		t = datatable.GetType();
		sInfo = t.GetProperty("Rows");
		rowVal = sInfo.GetValue(datatable, null);
		t = rowVal.GetType();
		/* TODO: FIX ME, get the first row? */
		sInfo = t.GetProperty("Item", new Type[] {
				Type.GetType("System.Int32") } );
		itemRowVal = sInfo.GetValue(rowVal, new object[] { rowid } );

		t = itemRowVal.GetType();
		sInfo = t.GetProperty("Item", new Type[] { Type.GetType("System.String") });
		sVal = sInfo.GetValue(itemRowVal, new object[] { field } );
		
		return sVal;
				
	}
	
	private Object GetTableData(Object field, Object dataset)
	{
		Type t;
		PropertyInfo sInfo;
		Object tableVal, itemTableVal;
		
		if( field == null )
			throw new ArgumentNullException(S._("Field"));

		if( dataset == null )
			throw new ArgumentNullException(S._("DataSet"));
			
		t = dataset.GetType();
		sInfo = t.GetProperty("Tables");
		
		tableVal = sInfo.GetValue(this.DataSource, null);
		t = tableVal.GetType();
		sInfo = t.GetProperty("Item", new Type[] { Type.GetType("System.String") });
		itemTableVal = sInfo.GetValue(tableVal, new object[] { field } );

		return itemTableVal;
	}
	
	
	// Pull data from the data source (called from BindingManagerBase).
	internal void PullData()
			{
				Type sourceType = this.DataSource.GetType();
				/* Usually System.Data Objects */
				if( sourceType.GetInterface("IListSource") != null )
				{
					if(sourceType.ToString() == "System.Data.DataSet")
					{
						Object itemTableVal = GetTableData(this.BindingMemberInfo.BindingPath, this.DataSource );
						Object sVal = GetRowData(this.BindingMemberInfo.BindingField, itemTableVal, 0 );
						dataSourceData = sVal;
						
					}
					else if(sourceType.ToString() == "System.Data.DataTable")
					{
						Object sVal = GetRowData(this.BindingMemberInfo.BindingField, this.DataSource, 0 );
						dataSourceData = sVal;
					}
				}
				else  /* Default Simple Object */
				{

					/* Let's get the PropertyInfo for the DataField prescribed, then determine
					 * its type, get the PropertyInfo for the property we're binding to, then
					 * pull the data from the source and attach it to the property. */
					PropertyInfo sInfo = sourceType.GetProperty(this.BindingMemberInfo.BindingField);
					PropertyInfo controlDataInfo = sourceType.GetProperty(this.PropertyName);
					Object sVal = sInfo.GetValue(this.DataSource, null);
					this.bindingMemberInfo.BindingFieldType = sVal.GetType();
	
					dataSourceData = sVal;
				}
	
			}

	// Push data to the data bound control (called from BindingManagerBase).
	internal void PushData()
			{
				Type controlType = control.GetType();
				PropertyInfo controlInfo = controlType.GetProperty(propertyName);
				controlInfo.SetValue(control, dataSourceData, null);
			}

}; // class Binding

}; // namespace System.Windows.Forms

About Koders | Resources | Downloads | Support | Black Duck | Terms of Service | DMCA | Privacy Policy | Contact Us