Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / xsp / System / DynamicData / DynamicData / FilterUserControlBase.cs / 1305376 / FilterUserControlBase.cs
using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Text; using System.Web.Compilation; using System.Web.Resources; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Routing; namespace System.Web.DynamicData { ////// Base class for the filter user control /// public class FilterUserControlBase : UserControl, IControlParameterTarget { private MetaColumn _column; private FilterDelegateBase _filterDelegate; private DataKey _selectedDataKey; private bool? _isPostBackMock; private RouteValueDictionary _routeValues; ////// Name of the table that the filter applies to /// [Category("Data")] [DefaultValue((string)null)] public string TableName { get; set; } ////// Name of the column that the filter applies to /// [Category("Data")] [DefaultValue((string)null)] public string DataField { get; set; } ////// The type of the context that the table/column is part of /// [Category("Data")] [DefaultValue((string)null)] public string ContextTypeName { get; set; } ////// The value selcted in the drop down /// public virtual string SelectedValue { get { return null; } } ////// The DataKey of the selected item /// public virtual DataKey SelectedDataKey { get { if (_selectedDataKey == null) { // Build a DataKey for the primary key of the selected item var fkColumn = Column as MetaForeignKeyColumn; if (fkColumn == null) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_SelectedDataKeyNotSupportedForThisField, ID, DataField)); } if (String.IsNullOrEmpty(SelectedValue)) return null; MetaTable parentTable = fkColumn.ParentTable; // string[] keyNames = parentTable.PrimaryKeyNames; string[] keyStrings = Misc.ParseCommaSeparatedString(SelectedValue); Debug.Assert(keyStrings.Length == keyNames.Length); var keyTable = new OrderedDictionary(keyNames.Length); for (int i = 0; i < keyNames.Length; i++) { keyTable.Add(keyNames[i], keyStrings[i]); } _selectedDataKey = new DataKey(keyTable, keyNames); } return _selectedDataKey; } } private FilterDelegateBase FilterDelegate { get { EnsureInit(); return _filterDelegate; } } ////// The initial value of the filter when it gets populated (i.e. the current value) /// public string InitialValue { get { return FilterDelegate.InitialValue; } } ////// Populate a ListControl with all the items in the foreign table (or true/false for boolean fields) /// /// public void PopulateListControl(ListControl listControl) { FilterDelegate.PopulateListControl(listControl); } ////// The column this filter applies to /// public MetaColumn Column { get { EnsureInit(); return _column; } } private void EnsureInit() { if (_column != null) return; // make sure we have a DataField if (String.IsNullOrEmpty(DataField)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_MissingDataField, ID)); } MetaTable table = null; if (!String.IsNullOrEmpty(ContextTypeName) || !String.IsNullOrEmpty(TableName)) { // make sure both ContextTypeName and TableName are specified together if (String.IsNullOrEmpty(ContextTypeName)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_MissingContextTypeName, ID)); } if (String.IsNullOrEmpty(TableName)) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_MissingTableName, ID)); } Type contextType = GetContextType(ContextTypeName); MetaModel model = null; try { model = MetaModel.GetModel(contextType); } catch (InvalidOperationException e) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_UnknownContextType, ID, contextType.FullName), e); } string tableName = TableName; try { table = model.GetTable(tableName); } catch (ArgumentException e) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_InvalidTableName, ID, tableName), e); } } else { // get context information from request context table = DynamicDataRouteHandler.GetRequestMetaTable(HttpContext.Current); if (table == null) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_CantInferInformationFromRequestUrl, ID)); } } try { _column = table.GetColumn(DataField); } catch (InvalidOperationException e) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_InvalidDataField, ID, DataField), e); } // create appropriate filter implementation based on column type if (_column is MetaForeignKeyColumn) { _filterDelegate = new ForeignKeyFilterDelegate(this); } else if (_column.ColumnType == typeof(bool) && !_column.IsCustomProperty) { _filterDelegate = new BooleanPropertyFilterDelegate(this); } else { _filterDelegate = new DefaultPropertyFilterDelegate(this); } } private Type GetContextType(string contextTypeName) { Type contextType = null; if (!String.IsNullOrEmpty(contextTypeName)) { try { contextType = BuildManager.GetType(contextTypeName, /*throwOnError*/ true, /*ignoreCase*/ true); } catch (Exception e) { throw new InvalidOperationException(String.Format( CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_InvalidContextTypeName, ID, contextTypeName), e); } } return contextType; } internal bool IsPostBackInternal { get { return _isPostBackMock ?? base.IsPostBack; } set { _isPostBackMock = value; } } internal RouteValueDictionary RouteValues { get { if (_routeValues == null) { RequestContext requestContext = DynamicDataRouteHandler.GetRequestContext(Context); _routeValues = requestContext.RouteData.Values; } return _routeValues; } set { _routeValues = value; } } #region IDynamicControlParameterProvider Members MetaTable IControlParameterTarget.Table { get { EnsureInit(); ForeignKeyFilterDelegate foreignKeyDelegate = FilterDelegate as ForeignKeyFilterDelegate; if (foreignKeyDelegate != null) { return foreignKeyDelegate.FilterTable; } else { return null; } } } MetaColumn IControlParameterTarget.FilteredColumn { get { EnsureInit(); return _column; } } string IControlParameterTarget.GetPropertyNameExpression(string columnName) { return FilterDelegate.GetPropertyNameExpression(columnName); } #endregion private abstract class FilterDelegateBase { private string _initialValue; private bool _initialValueObtained = false; public FilterDelegateBase(FilterUserControlBase filterControl) { FilterUserControl = filterControl; } public abstract void PopulateListControl(ListControl listControl); public abstract string GetPropertyNameExpression(string columnName); protected FilterUserControlBase FilterUserControl { get; private set; } public string InitialValue { get { // Ignore the query string param on postbacks if (!_initialValueObtained && !FilterUserControl.IsPostBackInternal) { _initialValue = GetInitialValueFromQueryString(); _initialValueObtained = true; } return _initialValue; } } protected abstract string GetInitialValueFromQueryString(); } private class DefaultPropertyFilterDelegate : FilterDelegateBase { public DefaultPropertyFilterDelegate(FilterUserControlBase filterControl) : base(filterControl) { } public override void PopulateListControl(ListControl listControl) { throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, DynamicDataResources.FilterUserControlBase_UnsupportedDataField, FilterUserControl.ID, FilterUserControl.DataField)); } public override string GetPropertyNameExpression(string columnName) { return "SelectedValue"; } protected override string GetInitialValueFromQueryString() { object value; if (FilterUserControl.RouteValues.TryGetValue(FilterUserControl.Column.Name, out value)) { return value as string; } return null; } } private class BooleanPropertyFilterDelegate : DefaultPropertyFilterDelegate { public BooleanPropertyFilterDelegate(FilterUserControlBase filterControl) : base(filterControl) { } public override void PopulateListControl(ListControl listControl) { listControl.Items.Add(new ListItem(DynamicDataResources.FilterUserControlBase_BooleanFilter_TrueString, bool.TrueString)); listControl.Items.Add(new ListItem(DynamicDataResources.FilterUserControlBase_BooleanFilter_FalseString, bool.FalseString)); } } private class ForeignKeyFilterDelegate : FilterDelegateBase { public ForeignKeyFilterDelegate(FilterUserControlBase filterControl) : base(filterControl) { FilterTable = ((MetaForeignKeyColumn)filterControl.Column).ParentTable; } internal MetaTable FilterTable { get; private set; } public override void PopulateListControl(ListControl listControl) { Misc.FillListItemCollection(FilterTable, listControl.Items); } public override string GetPropertyNameExpression(string columnName) { return String.Format(CultureInfo.InvariantCulture, "SelectedDataKey['{0}']", columnName); } protected override string GetInitialValueFromQueryString() { var fkColumn = (MetaForeignKeyColumn)FilterUserControl.Column; var builder = new StringBuilder(); for (int i = 0; i < fkColumn.ForeignKeyNames.Count; i++) { // The query string parameter looks like CategoryID=5 string queryStringParamName = fkColumn.ForeignKeyNames[i]; object value; // If any of the fk components are missing, we don't have a value for the filter if (!FilterUserControl.RouteValues.TryGetValue(queryStringParamName, out value)) { return String.Empty; } string pkValue = (string)value; // For the ListControl value, we use a comma separated list of primary keys, instead of using // named keys. This is simpler since the ListControl value must be a single string. if (i > 0) { builder.Append(","); } builder.Append(pkValue); } return builder.ToString(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MessagingActivityHelper.cs
- CompressStream.cs
- ValidatorCompatibilityHelper.cs
- BoundField.cs
- Button.cs
- XsdBuildProvider.cs
- DataGridViewHeaderCell.cs
- Base64Stream.cs
- SynchronizedPool.cs
- EventInfo.cs
- TextTreeInsertElementUndoUnit.cs
- DiagnosticTrace.cs
- DbParameterHelper.cs
- BitmapVisualManager.cs
- WebConvert.cs
- JsonReaderWriterFactory.cs
- MediaContextNotificationWindow.cs
- CookieParameter.cs
- DataServiceRequestOfT.cs
- InvalidCastException.cs
- CompilerLocalReference.cs
- COM2ICategorizePropertiesHandler.cs
- ActivityDesignerAccessibleObject.cs
- Query.cs
- JpegBitmapDecoder.cs
- WindowsGraphics2.cs
- NameNode.cs
- PackagePartCollection.cs
- WorkflowMarkupSerializationManager.cs
- Margins.cs
- StreamSecurityUpgradeInitiatorAsyncResult.cs
- Merger.cs
- ImageDrawing.cs
- QueryTask.cs
- KeyInstance.cs
- controlskin.cs
- CodeCastExpression.cs
- GatewayDefinition.cs
- RedirectionProxy.cs
- SafePEFileHandle.cs
- GPStream.cs
- SelectedDatesCollection.cs
- CopyEncoder.cs
- IIS7WorkerRequest.cs
- MessageSmuggler.cs
- FileUpload.cs
- CommonObjectSecurity.cs
- TimeSpanValidator.cs
- ContainerParaClient.cs
- _ProxyRegBlob.cs
- ScrollableControl.cs
- PersonalizablePropertyEntry.cs
- CapabilitiesSection.cs
- RTLAwareMessageBox.cs
- SmtpAuthenticationManager.cs
- ImageDrawing.cs
- SmtpAuthenticationManager.cs
- TreeChangeInfo.cs
- XmlTextReaderImplHelpers.cs
- ThreadPoolTaskScheduler.cs
- BooleanKeyFrameCollection.cs
- XmlHierarchicalEnumerable.cs
- Camera.cs
- BoolLiteral.cs
- TwoPhaseCommit.cs
- ArgumentOutOfRangeException.cs
- SystemResourceHost.cs
- ToolStripCustomTypeDescriptor.cs
- ClientRuntime.cs
- EffectiveValueEntry.cs
- RevocationPoint.cs
- SafeHandle.cs
- TransactionFlowElement.cs
- WriteFileContext.cs
- DefaultDialogButtons.cs
- ListControl.cs
- RijndaelCryptoServiceProvider.cs
- LocalizeDesigner.cs
- SafeNativeMemoryHandle.cs
- ListBox.cs
- Material.cs
- Error.cs
- NamedElement.cs
- PageThemeParser.cs
- EventMap.cs
- DialogResultConverter.cs
- IPCCacheManager.cs
- Stream.cs
- RTLAwareMessageBox.cs
- SchemaDeclBase.cs
- MappingItemCollection.cs
- TemplateControlBuildProvider.cs
- RelationshipWrapper.cs
- TemplateGroupCollection.cs
- SparseMemoryStream.cs
- ManagementObject.cs
- ShapingEngine.cs
- CompletionBookmark.cs
- DataSourceXmlElementAttribute.cs
- DesignerWithHeader.cs