2009年5月29日

让Fireball CodeEditor控件支持中文

Fireball.CodeEditor是个很强大的编辑器。实话说,就一个编辑器,附加那么多DLL,有些不合算,呵呵。

语法文件内置,编译的时候已经提供了大量的语法文件,是全部编辑器里面内置最多的一个编辑器。可以使用DLL文件对语法进行扩充。提供设置界面对语法高亮进行设置,只是界面不咋滴,呵呵,过于简单了一些。提供传说中的无限级别的redo功能,这个功能的确是编辑器不可或缺的。提供find和 replace功能。中文支持不是差劲的问题,是非常非常差劲。一旦输入中文就会出现光标位置不对,@_@.

代码折叠存在问题,没有办法折叠注释块。正常的代码折叠,我测试了一下C#和Java没有问题,但是XML折叠存在问题,只能折叠CDATA,有点不可思议。

折叠的方式比较漂亮,和VS的风格一致

1

有意思的是,这个编辑器组件对在注释中的东东也进行了语法高亮、括号匹配,不知道是错误还是就是如此,哈哈。

2

致命伤:输入中文的时候出现错误,例如你输入"测试",在编辑器里面会出现"测试测试",任何中文字符都是如此,如果使用Copy则不会出现这样的问题。在输入中文的时候redo也存在问题,原本输入两个汉字变成4个汉字,但是redo的时候却需要redo 4次。打开中文文件时大多会出现乱码。:)。

//解决重复输入问题:
//CodeEditor\Editors\EditView\EditViewControl.cs
protected override void OnKeyPress(KeyPressEventArgs e)
{
    base.OnKeyPress(e);
    if (!e.Handled && !_KeyDownHandled && e.KeyChar != (char)127)
    {
        if (((int)e.KeyChar) < 32)
            return;
        if (!this.ReadOnly)
        {
            switch ((Keys)(int)e.KeyChar)
            {
                default:
                    {
                        InsertText(e.KeyChar.ToString());

                        if (this.Indent == IndentStyle.Scope || this.Indent == IndentStyle.Smart)
                        {
                            if (Caret.CurrentRow.ShouldOutdent)
                            {
                                OutdentEndRow();
                            }
                        }
                        //增加本行,如果不增加则输入中文的时候会重复输入一次,寒 
                        e.Handled = true;
                        break;
                    }
            }
        }
    }
    if (AutoListVisible && !e.Handled && _CodeEditor.AutoListAutoSelect)
    {
        string s = Caret.CurrentRow.Text;
        //try 
        //{ 
        if (Caret.Position.X - AutoListStartPos.X >= 0)
        {
            s = s.Substring(AutoListStartPos.X, Caret.Position.X - AutoListStartPos.X);
            AutoList.SelectItem(s);
        }
        //} 
        //catch 
        //{ 
        //} 
    }
}
/************************************************************/
//解决打开文件出现乱码的问题: 
//CodeEditor\Editors\CodeEditorControl.cs
public void Open(string filename)
{
    if (this.Document == null)
        throw new NullReferenceException("CodeEditorControl.Document");
    //添加System.Text.Encoding.Default,否则中文显示为乱码
    StreamReader swr = new StreamReader(filename, System.Text.Encoding.Default);
    this.Document.Text = swr.ReadToEnd();
    swr.Close();
    SetFileName(filename);
    this.Saved = true;
}

posted @ 2009-05-29 01:59 Lionheart Zhang 阅读(278) 评论(0) 编辑

刚学习C#时自己写的数据库连接类

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DBUtility
{
    /// <summary>
    /// SQLServer的数据库连接类
    /// </summary>
    public abstract class SQLDBHelper
    {
        private static SqlConnection conn = new SqlConnection(
            ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);

        private SQLDBHelper() { }

        ~SQLDBHelper()
        {
            Dispose();
        }

        /// <summary>
        /// 释放资源
        /// </summary>
        public static void Dispose()
        {
            // 确认连接是否已经关闭
            if (conn != null)
            {
                conn.Dispose();
                conn = null;
            }
        }

        /// <summary>
        /// 打开连接
        /// </summary>
        private static void Open()
        {
            if (conn.State == ConnectionState.Closed)
            {
                try
                {
                    conn.Open();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

        /// <summary>
        /// 关闭连接
        /// </summary>
        private static void Close()
        {
            while (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
        }

        /// <summary>
        /// 执行查询语句或存储过程并返回受影响的行数
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <returns>受影响的行数</returns>
        public static int ExecuteNonQuery(string sql)
        {
            return ExecuteNonQuery(sql, null);
        }

        /// <summary>
        /// 执行查询语句或存储过程并返回受影响的行数
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>受影响的行数</returns>
        public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
        {
            int returnValue;
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (sql.ToLower().StartsWith("insert ") || sql.ToLower().StartsWith("update ")
                || sql.ToLower().StartsWith("delete "))
            {
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (parameters != null)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    cmd.Parameters.Add(parameters[i]);
                }
            }
            try
            {
                Open();
                returnValue = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                Close();
            }
            return returnValue;
        }

        /// <summary>
        /// 执行查询或存储过程并返回是否有查询结果
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <returns>是否有查询结果</returns>
        public static bool ExecuteReader(string sql)
        {
            return ExecuteReader(sql, null);
        }

        /// <summary>
        /// 执行查询或存储过程并返回是否有查询结果
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>是否有查询结果</returns>
        public static bool ExecuteReader(string sql, params SqlParameter[] parameters)
        {
            bool flag = false;
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (sql.ToLower().StartsWith("select "))
            {
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (parameters != null)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    cmd.Parameters.Add(parameters[i]);
                }
            }
            try
            {
                Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    flag = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                Close();
            }
            return flag;
        }

        /// <summary>
        /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <returns>结果集中第一行的第一列</returns>
        public static object ExecuteScalar(string sql)
        {
            return ExecuteScalar(sql, null);
        }

        /// <summary>
        /// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>结果集中第一行的第一列</returns>
        public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
        {
            object returnValue;
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (sql.ToLower().StartsWith("select "))
            {
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (parameters != null)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    cmd.Parameters.Add(parameters[i]);
                }
            }
            try
            {
                Open();
                returnValue = cmd.ExecuteScalar();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                Close();
            }
            return returnValue;
        }

        /// <summary>
        /// 获得数据集
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <param name="tableName">要查询的表名</param>
        /// <returns>数据集</returns>
        public static DataSet GetDataSet(string sql, string tableName)
        {
            return GetDataSet(sql, tableName, null);
        }

        /// <summary>
        /// 获得数据集
        /// </summary>
        /// <param name="sql">查询语句或存储过程</param>
        /// <param name="tableName">要查询的表名</param>
        /// <param name="parameters">参数</param>
        /// <returns>数据集</returns>
        public static DataSet GetDataSet(string sql, string tableName, params SqlParameter[] parameters)
        {

            SqlCommand cmd = new SqlCommand(sql, conn);
            if (sql.ToLower().StartsWith("select "))
            {
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (parameters != null)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    cmd.Parameters.Add(parameters[i]);
                }
            }
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds, tableName);
            return ds;
        }

        /// <summary>
        /// 根据数据集修改数据库
        /// </summary>
        /// <param name="ds">数据集</param>
        /// <param name="sql">获得次数据集的查询语句或存储过程</param>
        /// <returns>受影响的行数</returns>
        public static int AcceptChanges(DataSet ds, string sql)
        {
            return AcceptChanges(ds, sql);
        }

        /// <summary>
        /// 根据数据集修改数据库
        /// </summary>
        /// <param name="ds">数据集</param>
        /// <param name="sql">获得次数据集的查询语句或存储过程</param>
        /// <param name="parameters">参数列表</param>
        /// <returns>受影响的行数</returns>
        public static int AcceptChanges(DataSet ds, string sql, params SqlParameter[] parameters)
        {
            int rows = 0;
            //取出表结构
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (sql.ToLower().StartsWith("select "))
            {
                cmd.CommandType = CommandType.Text;
            }
            else
            {
                cmd.CommandType = CommandType.StoredProcedure;
            }
            if (parameters != null)
            {
                for (int i = 0; i < parameters.Length; i++)
                {
                    cmd.Parameters.Add(parameters[i]);
                }
            }
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            //生成实现 DataSet 的更改与关联的 SQL Server 实例之间的协调所需的 Transact-SQL 语句。
            SqlCommandBuilder cb = new SqlCommandBuilder(da);
            try
            {
                rows = da.Update(ds, sql);
                ds.AcceptChanges();
            }
            catch
            {
            }
            return rows;
        }
    }
}

posted @ 2009-05-29 01:42 Lionheart Zhang 阅读(129) 评论(0) 编辑

试用Windows Live Writer

看的不少人都使用Windows Live Writer了,而且博客园也推荐使用,既然如此,我今天就来试用一番。
博客园也真是的,代码高亮的插件也不直接给个链接,我还是Google搜了一番才在CodePlex找到的。
刚点安装,就提示需要3.5运行库,晕哦,我这台还没装运行环境呢,明天再装吧,先试着发一贴看看效果。
看的有的人说速度慢了些,估计是有图片的原因,现在也没啥图片,先发了再说。

posted @ 2009-05-29 01:19 Lionheart Zhang 阅读(28) 评论(0) 编辑