как отметить ключевые слова в RichEditControl

Я использую DevExpress RichEditControl в WindowsForm.

Я пытаюсь позволить пользователю вводить операторы sql.

Как я могу изменить цвет ключевого слова на СИНИЙ, например SELECT, FROM, ORDER BY, когда пользователь вводит его?


person Jassim Rahma    schedule 22.03.2014    source источник


Ответы (2)



Вы можете реализовать это two способами.

1. Реализуйте упрощенную подсветку синтаксиса для языка T-SQL, зарегистрировав службу ISyntaxHighlightService.

2. Вы можете использовать библиотеку DevExpress.CodeParser. Его можно использовать для анализа текста на следующих языках: C#, Visual Basic, JavaScript, HTML, XAML, CSS.

Этот код для first. вы можете выделить ключевые слова, которые вы хотите. Пример кода доступен здесь https://www.devexpress.com/Support/Center/Example/Details/E4139.

public partial class Form1 : Form
{
    public Form1() 
    {
        InitializeComponent();
        richEditControl1.ActiveViewType = DevExpress.XtraRichEdit.RichEditViewType.Draft;
        richEditControl1.ReplaceService<ISyntaxHighlightService>(new CustomSyntaxHighlightService(richEditControl1.Document));

    }
}

public class CustomSyntaxHighlightService : ISyntaxHighlightService 
{
    readonly Document document;
    SyntaxHighlightProperties defaultSettings = new SyntaxHighlightProperties()
    { 
       ForeColor = Color.Black 
    };
    SyntaxHighlightProperties keywordSettings = new SyntaxHighlightProperties() 
    { 
       ForeColor = Color.Blue
    };
    SyntaxHighlightProperties stringSettings = new SyntaxHighlightProperties()
    {
       ForeColor = Color.Green
    };

    string[] keywords = new string[] 
    { 
        "INSERT", "SELECT", "CREATE", "TABLE", "USE", "IDENTITY", "ON", "OFF", "NOT", "NULL", "WITH", "SET" "ORDER BY" 
    };

    public CustomSyntaxHighlightService(Document document)
    {
        this.document = document;
    }

    private List<SyntaxHighlightToken> ParseTokens() 
    {
        List<SyntaxHighlightToken> tokens = new List<SyntaxHighlightToken>();
        DocumentRange[] ranges = null;
        ranges = document.FindAll("'", SearchOptions.None);
        for (int i = 0; i < ranges.Length / 2; i++)
        {
            tokens.Add(new SyntaxHighlightToken(ranges[i * 2].Start.ToInt(), 
                ranges[i * 2 + 1].Start.ToInt() - ranges[i * 2].Start.ToInt() + 1, stringSettings));
        }
        for (int i = 0; i < keywords.Length; i++)
        {
            ranges = document.FindAll(keywords[i], SearchOptions.CaseSensitive | SearchOptions.WholeWord);

            for (int j = 0; j < ranges.Length; j++)
            {
                if (!IsRangeInTokens(ranges[j], tokens))
                    tokens.Add(new SyntaxHighlightToken(ranges[j].Start.ToInt(), ranges[j].Length, keywordSettings));
            }
        }
        tokens.Sort(new SyntaxHighlightTokenComparer());
        AddPlainTextTokens(tokens);
        return tokens;
    }

    private void AddPlainTextTokens(List<SyntaxHighlightToken> tokens)
    {
        int count = tokens.Count;
        if (count == 0) 
        {
            tokens.Add(new SyntaxHighlightToken(0, document.Range.End.ToInt(), defaultSettings));
            return;
        }
        tokens.Insert(0, new SyntaxHighlightToken(0, tokens[0].Start, defaultSettings));

        for (int i = 1; i < count; i++)
        {
           tokens.Insert(i * 2, new SyntaxHighlightToken(tokens[i * 2 - 1].End,tokens[i * 2].Start - tokens[i * 2 - 1].End, defaultSettings));
        }
           tokens.Add(new SyntaxHighlightToken(tokens[count * 2 - 1].End,document.Range.End.ToInt() - tokens[count * 2 - 1].End, defaultSettings));
    }

   private bool IsRangeInTokens(DocumentRange range, List<SyntaxHighlightToken> tokens)
   {
        for (int i = 0; i < tokens.Count; i++) 
        {
            if (range.Start.ToInt() >= tokens[i].Start && range.End.ToInt() <= tokens[i].End)
                return true;
        }
        return false;
    }
    public void ForceExecute()
    {
        Execute();
    }

    public void Execute()
    {
        document.ApplySyntaxHighlight(ParseTokens());
    }
}

public class SyntaxHighlightTokenComparer : IComparer<SyntaxHighlightToken>
{
    public int Compare(SyntaxHighlightToken x, SyntaxHighlightToken y) 
    {
        return x.Start - y.Start;
    }
}

Если вы хотите реализовать с помощью DevExpress.CodeParser library

вот пример кода https://www.devexpress.com/Support/Center/Example/Details/E2993

person NullReferenceException    schedule 23.03.2014