65.9K
CodeProject is changing. Read more.
Home

Use C# write a designer like PowerDesigner

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.72/5 (14 votes)

Aug 15, 2006

viewsIcon

137977

downloadIcon

643

How to develop a database structure designer use C#

Sample Image - xdbdesigner.png

Introduction

XDBDesigner is a WYSWYG  designer which can design database structure , just lick PowerDesigner , and it can load PDM file which created by PowerDesigner . It can save design result to a XML file and load design from a XML file . It is a appliction of XDesignerLib .

Using the code

XDBDesigner is a application of XDesignerLib , XDesignerLib is a middle ware which use to create WYSWYG designer easy and fast . XDesignerLib already bring a set of design DOOM ,  people can extend design DOM to create own designer . For example , in XDBDesigner , it create a tablefield element by the following C# code : 

public class DesignDBFieldElement : XDesignerDom.DesignLabelElement 
{
    public static System.Drawing.SolidBrush BackBrush = 
          new System.Drawing.SolidBrush( System.Drawing.Color.FromArgb( 0xff,0xA9,0xD2,0xFE)) ;

    public override bool RefreshView(DesignPaintEventArgs e)
    {
        if( myOwnerDocument.RuntimeScaleRate < 0.1 )
            return true;
        int index = myOwnerDocument.GetImageIndex( this );
        if( index >= 0 )
            this.Icon = myOwnerDocument.ImageList[ index ] ;
        if( this.LinkHightlight )
            e.FillDrawRects(  System.Drawing.SystemBrushes.Highlight , e.ViewBounds );
        else if( this.IsCurrent )
            e.FillDrawRects( System.Drawing.SystemBrushes.Info , e.ViewBounds );
        base.CustomDraw( e );
        return true;
    }
    public override System.Drawing.Color TextColor
    {
        get
        {
            if( this.LinkHightlight )
                return System.Drawing.SystemColors.HighlightText ;
            else
            {
                if( "new".Equals( Tag ))
                    return System.Drawing.Color.Blue ;
                else if( "delete".Equals ( Tag ))
                    return System.Drawing.Color.Red ;
                else
                    return System.Drawing.SystemColors.WindowText ;
            }
        }
        set
        {
            base.TextColor = value;
        }
    }
    public override bool LoadProperties(XDesignerProperty.IPropertyPackage Loader)
    {
        if( Loader.HasModified("customproperties")) 
            this.CustomProperties.ParseString( Loader.GetString("customproperties"));
        if( Loader.HasModified("convertlist")) 
            this.ConvertList.ParseString( Loader.GetString("convertlist"));
        if( Loader.HasModified("falsevalue")) 
            this.FalseValue = Loader.GetString("falsevalue");
        if( Loader.HasModified("truevalue")) 
            this.TrueValue = Loader.GetString("truevalue");
        if( Loader.HasModified("isboolean")) 
            this.IsBoolean = Loader.GetBoolean("isboolean" , false);
        if( Loader.HasModified("defaultvalue")) 
            this.DefaultValue = Loader.GetString("defaultvalue") ;
        if( Loader.HasModified("hasdefaultvalue")) 
            this.HasDefaultValue = Loader.GetBoolean("hasdefaultvalue" , false );
        if( Loader.HasModified("fformat")) 
            this.FFormat = Loader.GetString("fformat");
        if( Loader.HasModified("nullable")) 
            this.Nullable = Loader.GetBoolean("nullable" , true );
        if( Loader.HasModified("indexed")) 
            this.Indexed = Loader.GetBoolean("indexed" , false );
        if( Loader.HasModified("key")) 
            this.PrimaryKey = Loader.GetBoolean("key" , false );
        if( Loader.HasModified("fwidth")) this.FWidth = Loader.GetString("fwidth" ) ;
        if( Loader.HasModified("ftype")) this.FType = Loader.GetString("ftype");
        if( Loader.HasModified("remark")) this.Remark = Loader.GetString("remark");
        if( Loader.HasModified("desc")) this.Desc = Loader.GetString("desc");
        if( Loader.HasModified("fname") ) this.FName = Loader.GetString("fname");
        
        if( Loader.FromUI )
        {
            if( (( DesignDBTableElement ) myParent).RefreshPreferredWidth())
            {
                myParent.Resize();
                myParent.Invalidate();
            }
            if( this.PrimaryKey )
                ( ( DesignDBTableElement ) myParent ).KeyField = this.FName ;
            myOwnerDocument.RaiseChangeElement( this );
        }
        return true;
    }

    public override bool SaveProperties(XDesignerProperty.IPropertyPackage Saver)
    {
        Saver.SetString("convertlist", ConvertList.ToString());
        Saver.SetString("customproperties" , this.CustomProperties.ToString());
        Saver.SetString("falsevalue" , this.FalseValue );
        Saver.SetString("truevalue" , this.TrueValue );
        Saver.SetBoolean("isboolean" , this.IsBoolean , false );
        Saver.SetString("defaultvalue" , this.DefaultValue );
        Saver.SetBoolean("hasdefaultvalue" , this.HasDefaultValue , false );
        Saver.SetString("fformat" , this.FFormat );
        Saver.SetBoolean("indexed" , this.Indexed , false );
        Saver.SetBoolean("key" ,this.PrimaryKey , false );
        Saver.SetBoolean("nullable" , this.Nullable , true);
        Saver.SetString("fwidth" , this.FWidth );
        Saver.SetString("ftype" , this.FType );
        Saver.SetString("remark" , this.Remark );
        Saver.SetString("desc" , this.Desc );
        Saver.SetString("fname" , this.FName );
        if( myOwnerDocument.ForXSLTFlag )
        {
            Saver.SetString("isstring" , IsStringField() ? "1" : "0");
            Saver.SetString("isinteger" , IsIntegerField() ? "1" : "0");
            Saver.SetString("isfloat" , IsFloatField() ? "1" : "0" );
            Saver.SetString("isbyte" , this.IsByteField() ? "1" : "0");
            int index = myParent.Items.IndexOf( this );
            Saver.SetString("fixindex" ,
                index > 9 ? index.ToString() : index.ToString() + " " );
        }
        if( Saver is PropertyListItemCollection )
        {
            PropertyListItemCollection items = ( PropertyListItemCollection ) Saver ;
            PropertyStringItem item = ( PropertyStringItem ) items["fformat"];
            item.ListItems = new string[] {"String",
                          "Integer",
                          "Decimal",
                          "Double",
                          "DateTime",
                          "Base64",
                          "YYYYMMDDHHMMSS",
                          "YYYYMMDDHHMM",
                          "YYYYMMDDHH",
                          "YYYYMMDD",
                          "HHMMSS"};
            item = ( PropertyStringItem ) items["ftype"];
            item.ListItems = new string[]{ "image",
                         "text",
                         "uniqueidentifier",
                         "tinyint",
                         "smallint",
                         "int",
                         "smalldatetime",
                         "real",
                         "money",
                         "datetime",
                         "float",
                         "sql_variant",
                         "ntext",
                         "bit",
                         "decimal",
                         "numeric",
                         "smallmoney",
                         "bigint",
                         "varbinary",
                         "varchar",
                         "binary",
                         "char",
                         "timestamp",
                         "nvarchar",
                         "nchar",
                         "sysname"};
        }
        return true;
    }

    public object Tag = null;
    public override string TagName
    {
        get{ return "field";}
    }
    public DesignDBFieldElement()
    {
        base.bolMultiline = false;
        this.intAlign = System.Drawing.StringAlignment.Near ;
    }
    ///<summary>
    /// 字段名称
    ///</summary>            
    public string FName
    {
        get{ return strID ;}
        set{ strID = value;}
    }

    private string strDesc ;
    ///<summary>
    /// 字段说明
    ///</summary>            
    public string Desc
    {
        get{ return strDesc ;}
        set{ strDesc = value;}
    }

    private string strRemark ;
    ///<summary>
    /// 字段详细说明
    ///</summary>            
    public string Remark
    {
        get{ return strRemark ;}
        set{ strRemark = value;}
    }

    private string strFType ;
    ///<summary>
    /// 字段类型
    ///</summary>            
    public string FType
    {
        get{ return strFType ;}
        set{ strFType = value;}
    }

    private string strFWidth ;
    ///<summary>
    /// 字段长度
    ///</summary>            
    public string FWidth
    {
        get{ return strFWidth;}
        set{ strFWidth = value;}
    }

    private string strFFormat ;
    ///<summary>
    /// 字段内容格式
    ///</summary>            
    public string FFormat
    {
        get{ return strFFormat ;}
        set{ strFFormat = value;}
    }

    private bool bolNullable = true;
    ///<summary>
    /// 是否为空
    ///</summary>            
    public bool  Nullable
    {
        get{ return bolNullable ;}
        set{ bolNullable = value;}
    }

    private bool bolPrimaryKey = false;
    ///<summary>
    /// 是否为主键
    ///</summary>            
    public bool  PrimaryKey
    {
        get{ return bolPrimaryKey ;}
        set{ bolPrimaryKey = value;}
    }

    private bool bolIndexed = false;
    ///<summary>
    /// 是否索引
    ///</summary>            
    public bool  Indexed
    {
        get{ return bolIndexed ;}
        set{ bolIndexed = value;}
    }

    private bool bolHasDefaultValue = false;
    ///<summary>
    /// 是否有默认值
    ///</summary>            
    public bool  HasDefaultValue
    {
        get{ return bolHasDefaultValue ;}
        set{ bolHasDefaultValue = value;}
    }

    private string strDefaultValue ;
    ///<summary>
    /// 默认值
    ///</summary>            
    public string DefaultValue
    {
        get{ return strDefaultValue;}
        set{ strDefaultValue = value;}
    }

    private bool bolIsBoolean = false;
    ///<summary>
    /// 是否是布尔类型的字段
    ///</summary>            
    public bool  IsBoolean
    {
        get{ return bolIsBoolean ;}
        set{ bolIsBoolean = value;}
    }

    private string strTrueValue = null;
    ///<summary>
    /// 表示真的数值
    ///</summary>            
    public string TrueValue
    {
        get{ return strTrueValue ;}
        set{ strTrueValue = value;}
    }

    private string strFalseValue = null;
    ///<summary>
    /// 表示假的数值
    ///</summary>            
    public string FalseValue
    {
        get{ return strFalseValue ;}
        set{ strFalseValue = value;}
    }

    /// <summary>
    /// 转换列表
    /// </summary>
    public XDesignerCommon.StringValueItemCollection ConvertList =
         new XDesignerCommon.StringValueItemCollection();
    public XDesignerCommon.StringValueItemCollection CustomProperties = 
        new XDesignerCommon.StringValueItemCollection();
    
    public string ConvertListString
    {
        get{ return ConvertList.ToString(); }
        set{ ConvertList.ParseString( value );}
    }
}//public class DesignDBFieldElement : XDesigner.DesignLabel 

Points of Interest

Every one know it is very hard to develop a WYSWYG  designer , but using XDesignerLib middle ware , you can create your own WYSWYG designer fast and easy . What are you waiting for ? Try it at once . 

Learn more information about XDBDesigner , please visit http://www.xdesigner.cn/xdbdesigner/default-eng.htm .

Learn more information about XDesignerLib , please visit http://www.xdesigner.cn/xdesignerlib/default-eng.htm .

Lear more information about author , please visit http://www.xdesigner.cn/default-eng.htm or mail to yyf9989@hotmail.com .