65.9K
CodeProject 正在变化。 阅读更多。
Home

在 C# 中创建自动完成 HTML 标签

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2016年5月2日

CPOL

3分钟阅读

viewsIcon

16140

downloadIcon

374

在本文中,当在 C# 的 RichTextBox 中键入开始标签时,我们将自动关闭 HTML 标签。

下载源代码


引言

如今,几乎所有高级 HTML、PHP、JavaScript、Perl 等编辑器都支持自动关闭 HTML 标签功能。
Visual Studio 提供了丰富的内置功能,例如通过自动完成(代码完成)自动关闭标签。
在本文中,我们将创建自动完成 HTML 标签的功能。
下载源代码以查看简单和高级的 HTML 标签完成功能。

Procedure

步骤 1:在 C# 中创建 Windows Forms 应用程序。
步骤 2:将 RichTextBox 拖放到该窗体上。
步骤 3:为 RichTextBox 添加 KeyPressKeyDown 事件。

使用代码

首先声明变量

        public static String EnteredString = "";
        public static Boolean Is_LessThanKeyPressed = false;
        public static Boolean Is_GreaterThanKeyPressed = false;
        public static Boolean Is_AutoCompleteCharacterPressed = false;
        public Boolean Is_SpaceBarKeyPressed = false;
        public Boolean Is_TagClosedKeyPressed = false;

 

EnteredString: 字符串变量,用于保存 RichTextBox 中输入的字符。        
Is_LessThanKeyPressed: 当按下“<”键时,该值设置为 true,因为 HTML 标签以“<”(例如:<html)开头。
Is_GreaterThanKeyPressed: 当按下“>”键时,该值设置为 true,当按下“>”键时,
                        i)  从 RichTextBox 中选择当前索引。
                        ii) 在当前索引位置插入与起始标签关联的正确的关闭标签。
Is_AutoCompleteCharacterPressed: 当按下自动完成字符(如", ' , [ , ( ))时,该值设置为 true,用于执行 AutoCompleteBrackets 功能。
Is_SpaceBarKeyPressed: 当按下空格键时,该值设置为 true。此变量用于完成 html 标签,即使按下空格键也是如此。我们按下空格键来为给定的 html 标签添加属性,因此为了完成此标签,我们需要此变量。
Is_TagClosedKeyPressed: 当用户手动完成 html 标签(而不是自动完成)或自动完成功能失败时,该值设置为 true,用户必须结束标签,当他通过按下“>”键结束标签时,则该标签不应再次完成。                        

               
声明 html 标签的数组列表

    public String[] tagslist ={
        "html",
        "head",
        "title",
        "body",
        "h1",
        "h2",
        "h3",
        "h4",
        "h5",
        "h6",
        "b",
        "u",
        "i",
        "sub",
        "sup",
        "center",
        "strike",
        "font",
        "p",
        "style",
        "pre",
        "a",
        "img",
        "table",
        "tr",
        "th",
        "td",
        "form",
        "input",
        "div",
        };	

 

KeyPress 事件: 获取按下的字符。如果它是“<”,则设置 EnteredString="",将 Is_LessThanKeyPressed 值设为 true,并将 Is_SpaceBarKeyPressed 值设为 false。
如果按下的字符是“>”,则首先检查 Is_TagClosedKeyPressed 值是否为 false,如果为 false,则设置 Is_GreaterThanKeyPressed 值为 true 和 Is_SpaceBarKeyPressed 值为 false,并将关闭标签插入到
RichTextBox 中当前 SelectionStart 位置,通过将 EnteredString 与 tagslist 中的每个元素进行匹配。
插入标签后,设置 EnteredString=""。
如果按下的键是其他字符,则首先检查它是否是字母或数字,如果是,则将其与
EnteredString 连接。
这是代码

        private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            String ch = e.KeyChar.ToString();


            this.ProcessAutoCompleteBrackets(ch);

            if (ch == "<")
            {
                Is_LessThanKeyPressed = true;
                Is_SpaceBarKeyPressed = false;
                EnteredString = "";
            }
            else if (ch == ">")
            {
                if (!Is_TagClosedKeyPressed)
                {
                    Is_GreaterThanKeyPressed = true;
                    Is_SpaceBarKeyPressed = false;

                    int oldsel = richTextBox1.SelectionStart;

                    for (int i = 0; i < tagslist.Length; i++)
                    {
                        if (EnteredString == tagslist[i])
                        {
                            richTextBox1.Text = richTextBox1.Text.Insert(oldsel, "<!--" + tagslist[i] + "-->");
                            richTextBox1.SelectionStart = richTextBox1.SelectionStart + oldsel;
                            EnteredString = "";
                        }
                    }

                    Is_LessThanKeyPressed = false;
                }
                else
                {
                    Is_TagClosedKeyPressed = false;
                }
            }

            else
            {
                if (Is_LessThanKeyPressed)
                {
                    for (char a = 'a'; a <= 'z'; a++)
                    {
                        if (a.ToString() == ch)
                        {
                            EnteredString += ch;
                        }
                        else if (a.ToString().ToUpper() == ch)
                        {
                            EnteredString += ch;
                        }
                    }
                    for (int a = 0; a <= 9; a++)
                    {
                        if (a.ToString() == ch)
                        {
                            EnteredString += ch;
                        }
                    }
                }
            }


            // if user itself closes the tag
            if (Is_LessThanKeyPressed)
            {
                if (ch == "/")
                {
                    Is_TagClosedKeyPressed = true;
                    Is_SpaceBarKeyPressed = true;
                    EnteredString = "";
                }
            }
        }

 

KeyDown 事件: 如果键是空格键,则将 EnteredString 的值设置为与 tagslist 中存在的值相同。
如果键是向上、向下、向左、向右,则首先检查 Is_AutoCompleteCharacterPressed 是否为 false,如果是,则设置
EnteredString="" & Is_AutoCompleteCharacterPressed = false & Is_SpaceBarKeyPressed=false。
如果键是退格键,则从当前位置获取字符。如果该字符不等于“>”,则从 RichTextBox 中删除该字符,如果该字符是“<”,则设置 EnteredString=""。

        private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Space:
                    Is_SpaceBarKeyPressed = true;

                    if (Is_GreaterThanKeyPressed)
                    {
                        Is_GreaterThanKeyPressed = false;
                    }
                    Is_LessThanKeyPressed = false;

                    for (int i = 0; i < tagslist.Length; i++)
                    {
                        if(EnteredString==tagslist[i])
                        {
                            EnteredString = tagslist[i];
                        }
                    }
                    break;

                case Keys.Up:
                    if (Is_AutoCompleteCharacterPressed == false)
                    {
                        EnteredString = "";
                        Is_AutoCompleteCharacterPressed = false;
                    }
                    Is_SpaceBarKeyPressed = false;
                    break;

                case Keys.Down:
                    if (Is_AutoCompleteCharacterPressed == false)
                    {
                        EnteredString = "";
                        Is_AutoCompleteCharacterPressed = false;
                    }
                    Is_SpaceBarKeyPressed = false;
                    break;

                case Keys.Left:
                    if (Is_AutoCompleteCharacterPressed == false)
                    {
                        EnteredString = "";
                        Is_AutoCompleteCharacterPressed = false;
                    }
                    Is_SpaceBarKeyPressed = false;
                    break;

                case Keys.Right:
                    if (Is_AutoCompleteCharacterPressed == false)
                    {
                        EnteredString = "";
                        Is_AutoCompleteCharacterPressed = false;
                    }
                    Is_SpaceBarKeyPressed = false;
                    break;

                case Keys.Enter: EnteredString = "";
                    Is_SpaceBarKeyPressed = false;
                    break;

                case Keys.Back:
                    int sel = richTextBox1.SelectionStart;
                    Point pt = richTextBox1.GetPositionFromCharIndex(sel);
                    char ch = richTextBox1.GetCharFromPosition(pt);
                    if (EnteredString.Length > 0)
                    {
                        if (ch != '>')
                        {
                            EnteredString = EnteredString.Remove(EnteredString.Length - 1);
                            Is_LessThanKeyPressed = true;
                        }
                    }
                    if (ch == '<')
                    {
                        EnteredString = "";
                    }
                    break;
            }
        }
		

 

使用自动完成功能

我们还将使用自动完成(代码完成)功能创建 AutoComplete HTML 标签。
不知道如何在 C# 中创建自动完成,

         在 C# 中创建自动完成/代码完成

编码与上述文章链接中定义的一样,只是添加了 AutoComplete HTML 标签功能并修改了内容。
下载源代码以查看带有自动完成功能的自动 html 标签完成。
借助自动完成功能,您可以直接从弹出的列表中选择标签,并且只需按“>”键即可完成它们。
我在源代码中创建了 ACHTMLTags.cs (AutoCompleteHTMLTags) 类。  

© . All rights reserved.