Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / System / data / design / TypedColumnHandler.cs / 2 / TypedColumnHandler.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All Rights Reserved.
// Information Contained Herein is Proprietary and Confidential.
//
//-----------------------------------------------------------------------------
namespace System.Data.Design {
using System;
using System.CodeDom;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Design;
using System.Reflection;
internal sealed class TypedColumnHandler {
private TypedDataSourceCodeGenerator codeGenerator = null;
private DataTable table = null;
private DesignTable designTable = null;
private DesignColumnCollection columns = null;
internal TypedColumnHandler(DesignTable designTable, TypedDataSourceCodeGenerator codeGenerator) {
this.codeGenerator = codeGenerator;
this.table = designTable.DataTable;
this.designTable = designTable;
this.columns = designTable.DesignColumns;
}
internal void AddPrivateVariables(CodeTypeDeclaration dataTableClass) {
if(dataTableClass == null) {
throw new InternalException("Table CodeTypeDeclaration should not be null.");
}
if( columns == null ) {
return;
}
foreach(DesignColumn column in columns) {
//\\ private DataColumn ;
dataTableClass.Members.Add(CodeGenHelper.FieldDecl(CodeGenHelper.GlobalType(typeof(System.Data.DataColumn)), column.GeneratorColumnVarNameInTable));
}
}
internal void AddTableColumnProperties(CodeTypeDeclaration dataTableClass) {
if( columns == null ) {
return;
}
foreach(DesignColumn column in columns) {
//\\ public DataColumn {
//\\ get { return this.; }
//\\ }
CodeMemberProperty colProp = CodeGenHelper.PropertyDecl(
CodeGenHelper.GlobalType(typeof(System.Data.DataColumn)),
column.GeneratorColumnPropNameInTable,
MemberAttributes.Public | MemberAttributes.Final
);
colProp.GetStatements.Add(
CodeGenHelper.Return(
CodeGenHelper.Field(CodeGenHelper.This(), column.GeneratorColumnVarNameInTable)
)
);
dataTableClass.Members.Add(colProp);
}
}
internal void AddRowColumnProperties(CodeTypeDeclaration rowClass) {
bool storageInitialized = false;
string rowClassName = codeGenerator.TableHandler.Tables[table.TableName].GeneratorRowClassName;
string tableFieldName = codeGenerator.TableHandler.Tables[table.TableName].GeneratorTableVarName;
foreach(DesignColumn designColumn in columns) {
DataColumn column = designColumn.DataColumn;
Type dataType = column.DataType;
string rowColumnName = designColumn.GeneratorColumnPropNameInRow;
string tableColumnName = designColumn.GeneratorColumnPropNameInTable;
GenericNameHandler propertyScopeNameHandler = new GenericNameHandler(new string[] { rowColumnName }, codeGenerator.CodeProvider);
//\\ public {
//\\ get {
//\\ try{
//\\ return (()(this[this.table.Column]));
//\\ }catch(InvalidCastException e) {
//\\ throw new StrongTypingException("StrongTyping_CananotAccessDBNull", e);
//\\ }
//\\ }
//\\or
//\\ get {
//\\ if(IsNull()){
//\\ return ();
//\\ }else {
//\\ return (()(this[this.table.Column]));
//\\ }
//\\ }
//\\or
//\\ get {
//\\ if(IsNull()){
//\\ return _nullValue;
//\\ }else {
//\\ return (()(this[this.table.Column]));
//\\ }
//\\ }
//\\
//\\ set {this[this.table.Column] = value;}
//\\ }
//\\
//\\if required:
//\\ private static _nullValue = ...;
CodeMemberProperty rowProp = CodeGenHelper.PropertyDecl(
CodeGenHelper.Type(dataType),
rowColumnName,
MemberAttributes.Public | MemberAttributes.Final
);
CodeStatement getStmnt = CodeGenHelper.Return(
CodeGenHelper.Cast(
CodeGenHelper.GlobalType(dataType),
CodeGenHelper.Indexer(
CodeGenHelper.This(),
CodeGenHelper.Property(
CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName),
tableColumnName
)
)
)
);
if(column.AllowDBNull) {
string nullValue = (string) column.ExtendedProperties["nullValue"];
if(nullValue == null || nullValue == "_throw") {
getStmnt = CodeGenHelper.Try(
getStmnt,
CodeGenHelper.Catch(
CodeGenHelper.GlobalType(typeof(System.InvalidCastException)),
propertyScopeNameHandler.AddNameToList("e"),
CodeGenHelper.Throw(
CodeGenHelper.GlobalType(typeof(System.Data.StrongTypingException)),
SR.GetString(SR.CG_ColumnIsDBNull, column.ColumnName, table.TableName),
propertyScopeNameHandler.GetNameFromList("e")
)
)
);
}else {
CodeExpression nullValueFieldInit = null; // in some cases we generate it
CodeExpression nullValueExpr;
if(nullValue == "_null") {
if(column.DataType.IsSubclassOf(typeof(System.ValueType))) {
codeGenerator.ProblemList.Add( new DSGeneratorProblem(SR.GetString(SR.CG_TypeCantBeNull, column.ColumnName, column.DataType.Name), ProblemSeverity.NonFatalError, designColumn) );
continue; // with next column.
}
nullValueExpr = CodeGenHelper.Primitive(null);
}
else if (nullValue == "_empty") {
if (column.DataType == typeof(string)) {
nullValueExpr = CodeGenHelper.Property(CodeGenHelper.TypeExpr(CodeGenHelper.GlobalType(column.DataType)), "Empty");
}
else {
nullValueExpr = CodeGenHelper.Field(
CodeGenHelper.TypeExpr(CodeGenHelper.Type(rowClassName)),
rowColumnName + "_nullValue"
);
//\\ private static _nullValue = new ();
/* check that object can be constructed with parameterless constructor */
ConstructorInfo constructor = column.DataType.GetConstructor(new Type[] { typeof(string) });
if (constructor == null) {
codeGenerator.ProblemList.Add(new DSGeneratorProblem(SR.GetString(SR.CG_NoCtor0, column.ColumnName, column.DataType.Name), ProblemSeverity.NonFatalError, designColumn));
continue; // with next column.
}
constructor.Invoke(new Object[] { }); // can throw here.
nullValueFieldInit = CodeGenHelper.New(CodeGenHelper.Type(column.DataType), new CodeExpression[] { });
}
}
else {
if (!storageInitialized) {
table.NewRow(); // by this we force DataTable create DataStorage for each column in a table.
storageInitialized = true;
}
object nullValueObj = codeGenerator.RowHandler.RowGenerator.ConvertXmlToObject.Invoke(column, new object[] { nullValue }); // an exception will be thrown if nullValue can't be conwerted to col.DataType
DSGeneratorProblem problem = CodeGenHelper.GenerateValueExprAndFieldInit(designColumn, nullValueObj, nullValue, rowClassName, rowColumnName + "_nullValue", out nullValueExpr, out nullValueFieldInit);
if (problem != null) {
codeGenerator.ProblemList.Add(problem);
continue; // with next column
}
}
getStmnt = CodeGenHelper.If(
CodeGenHelper.MethodCall(CodeGenHelper.This(), "Is" + rowColumnName + "Null"),
new CodeStatement[] {CodeGenHelper.Return(nullValueExpr)},
new CodeStatement[] {getStmnt}
);
if(nullValueFieldInit != null) {
CodeMemberField nullValueField = CodeGenHelper.FieldDecl(
CodeGenHelper.Type(column.DataType.FullName),
rowColumnName + "_nullValue"
);
nullValueField.Attributes = MemberAttributes.Static | MemberAttributes.Private;
nullValueField.InitExpression = nullValueFieldInit;
rowClass.Members.Add(nullValueField);
}
}
}
rowProp.GetStatements.Add(getStmnt);
rowProp.SetStatements.Add(
CodeGenHelper.Assign(
CodeGenHelper.Indexer(
CodeGenHelper.This(),
CodeGenHelper.Property(
CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName),
tableColumnName
)
),
CodeGenHelper.Value()
)
);
rowClass.Members.Add(rowProp);
if (column.AllowDBNull) {
//\\ public bool IsNull() {
//\\ return this.IsNull(this.table.Column);
//\\ }
string candidateName = "Is" + rowColumnName + "Null";
string validatedName = MemberNameValidator.GenerateIdName(candidateName, this.codeGenerator.CodeProvider, false /*useSuffix*/);
CodeMemberMethod isNull = CodeGenHelper.MethodDecl(
CodeGenHelper.GlobalType(typeof(System.Boolean)),
validatedName,
MemberAttributes.Public | MemberAttributes.Final
);
isNull.Statements.Add(
CodeGenHelper.Return(
CodeGenHelper.MethodCall(
CodeGenHelper.This(),
"IsNull",
CodeGenHelper.Property(
CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName),
tableColumnName
)
)
)
);
rowClass.Members.Add(isNull);
//\\ public void SetNull() {
//\\ this[this.table.Column] = DBNull.Value;
//\\ }
candidateName = "Set" + rowColumnName + "Null";
validatedName = MemberNameValidator.GenerateIdName(candidateName, this.codeGenerator.CodeProvider, false /*useSuffix*/);
CodeMemberMethod setNull =
CodeGenHelper.MethodDecl(
CodeGenHelper.GlobalType(typeof(void)),
validatedName,
MemberAttributes.Public | MemberAttributes.Final
);
setNull.Statements.Add(
CodeGenHelper.Assign(
CodeGenHelper.Indexer(
CodeGenHelper.This(),
CodeGenHelper.Property(
CodeGenHelper.Field(CodeGenHelper.This(), tableFieldName),
tableColumnName
)
),
CodeGenHelper.Field(CodeGenHelper.GlobalTypeExpr(typeof(Convert)), "DBNull")
)
);
rowClass.Members.Add(setNull);
}
}
}
internal void AddRowGetRelatedRowsMethods(CodeTypeDeclaration rowClass) {
DataRelationCollection childRelations = table.ChildRelations;
for (int i = 0; i < childRelations.Count; i++) {
//\\ public [] GetRows() {
//\\ return ([]) base.GetChildRows(this.Table.ChildRelations[""]);
//\\ }
DataRelation relation = childRelations[i];
string rowConcreteClassName = codeGenerator.TableHandler.Tables[relation.ChildTable.TableName].GeneratorRowClassName;
CodeMemberMethod childArray = CodeGenHelper.MethodDecl(
CodeGenHelper.Type(rowConcreteClassName, 1),
codeGenerator.RelationHandler.Relations[relation.RelationName].GeneratorChildPropName,
MemberAttributes.Public | MemberAttributes.Final
);
childArray.Statements.Add(
CodeGenHelper.If(
CodeGenHelper.IdEQ(
CodeGenHelper.Indexer(
CodeGenHelper.Property(
CodeGenHelper.Property(CodeGenHelper.This(), "Table"),
"ChildRelations"
),
CodeGenHelper.Str(relation.RelationName)
),
CodeGenHelper.Primitive(null)
),
CodeGenHelper.Return(
new CodeArrayCreateExpression(rowConcreteClassName, 0)
),
CodeGenHelper.Return(
CodeGenHelper.Cast(
CodeGenHelper.Type(rowConcreteClassName, 1),
CodeGenHelper.MethodCall(
CodeGenHelper.Base(),
"GetChildRows",
CodeGenHelper.Indexer(
CodeGenHelper.Property(
CodeGenHelper.Property(CodeGenHelper.This(), "Table"),
"ChildRelations"
),
CodeGenHelper.Str(relation.RelationName)
)
)
)
)
)
);
rowClass.Members.Add(childArray);
}
DataRelationCollection parentRelations = table.ParentRelations;
for (int i = 0; i < parentRelations.Count; i++) {
//\\ public Parent {
//\\ get {
//\\ return (()(this.GetParentRow(this.Table.ParentRelations[""])));
//\\ }
//\\ set {
//\\ this.SetParentRow(value, this.Table.ParentRelations[""]);
//\\ }
//\\ }
DataRelation relation = parentRelations[i];
string parentTypedRowName = codeGenerator.TableHandler.Tables[relation.ParentTable.TableName].GeneratorRowClassName;
CodeMemberProperty parentTableProp = CodeGenHelper.PropertyDecl(
CodeGenHelper.Type(parentTypedRowName),
codeGenerator.RelationHandler.Relations[relation.RelationName].GeneratorParentPropName,
MemberAttributes.Public | MemberAttributes.Final
);
parentTableProp.GetStatements.Add(
CodeGenHelper.Return(
CodeGenHelper.Cast(
CodeGenHelper.Type(parentTypedRowName),
CodeGenHelper.MethodCall(
CodeGenHelper.This(),
"GetParentRow",
CodeGenHelper.Indexer(
CodeGenHelper.Property(
CodeGenHelper.Property(CodeGenHelper.This(), "Table"),
"ParentRelations"
),
CodeGenHelper.Str(relation.RelationName)
)
)
)
)
);
parentTableProp.SetStatements.Add(
CodeGenHelper.MethodCall(
CodeGenHelper.This(),
"SetParentRow",
new CodeExpression[] {
CodeGenHelper.Value(),
CodeGenHelper.Indexer(
CodeGenHelper.Property(
CodeGenHelper.Property(CodeGenHelper.This(), "Table"),
"ParentRelations"
),
CodeGenHelper.Str(relation.RelationName)
)
}
)
);
rowClass.Members.Add(parentTableProp);
}
}
}
}
// 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
- NavigationWindow.cs
- DataSourceControlBuilder.cs
- Convert.cs
- precedingsibling.cs
- GeneralTransform3DGroup.cs
- ActivityDesignerLayoutSerializers.cs
- WinFormsSecurity.cs
- Menu.cs
- ScriptManager.cs
- DataViewManager.cs
- XPathDescendantIterator.cs
- RepeaterItemEventArgs.cs
- LoginUtil.cs
- RecommendedAsConfigurableAttribute.cs
- WsdlHelpGeneratorElement.cs
- ToolStripScrollButton.cs
- _DomainName.cs
- SelectionRangeConverter.cs
- ParameterBuilder.cs
- ObjectTokenCategory.cs
- CodeMethodReturnStatement.cs
- NavigationPropertyEmitter.cs
- TableLayoutPanelCodeDomSerializer.cs
- ContainerControl.cs
- ResourceManager.cs
- MouseBinding.cs
- BoundsDrawingContextWalker.cs
- StickyNote.cs
- ComponentCommands.cs
- BindingListCollectionView.cs
- TreeNodeCollectionEditorDialog.cs
- AnnotationComponentManager.cs
- MailFileEditor.cs
- TypedReference.cs
- WebPartTransformerAttribute.cs
- SequentialWorkflowHeaderFooter.cs
- UnitySerializationHolder.cs
- _FtpControlStream.cs
- AssemblyName.cs
- Validator.cs
- HyperLinkField.cs
- PtsHelper.cs
- PointCollection.cs
- WhitespaceRuleLookup.cs
- Bits.cs
- SerializationIncompleteException.cs
- CompareInfo.cs
- UnmanagedMemoryStream.cs
- ItemsPresenter.cs
- EditorBrowsableAttribute.cs
- SafeLocalAllocation.cs
- HtmlShim.cs
- WizardForm.cs
- AttributedMetaModel.cs
- GetCryptoTransformRequest.cs
- BamlReader.cs
- SspiSecurityTokenProvider.cs
- FixedSOMContainer.cs
- DynamicUpdateCommand.cs
- WindowsContainer.cs
- Margins.cs
- IEnumerable.cs
- BitmapCodecInfoInternal.cs
- XmlnsDefinitionAttribute.cs
- SpellerHighlightLayer.cs
- PostBackOptions.cs
- wgx_sdk_version.cs
- SystemIcons.cs
- ClientConfigPaths.cs
- TcpSocketManager.cs
- DataViewManagerListItemTypeDescriptor.cs
- DataTableReaderListener.cs
- Calendar.cs
- NullToBooleanConverter.cs
- xmlglyphRunInfo.cs
- RefExpr.cs
- DBDataPermission.cs
- CollectionBase.cs
- SqlTransaction.cs
- FocusTracker.cs
- ReflectionUtil.cs
- EdmSchemaError.cs
- mediaeventargs.cs
- DateTimeFormat.cs
- XComponentModel.cs
- ExpressionBuilder.cs
- BinaryExpression.cs
- ScriptReferenceBase.cs
- HandleRef.cs
- Graph.cs
- WebHttpSecurityModeHelper.cs
- SpotLight.cs
- ProviderConnectionPointCollection.cs
- EntityDataSourceDataSelectionPanel.cs
- TaiwanLunisolarCalendar.cs
- templategroup.cs
- ConnectionInterfaceCollection.cs
- InputLanguageProfileNotifySink.cs
- ResourceProviderFactory.cs
- CaseInsensitiveHashCodeProvider.cs