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





5.00/5 (6投票s)
在本文中,当在 C# 的 RichTextBox 中键入开始标签时,我们将自动关闭 HTML 标签。
下载源代码
引言
如今,几乎所有高级 HTML、PHP、JavaScript、Perl 等编辑器都支持自动关闭 HTML 标签功能。
Visual Studio 提供了丰富的内置功能,例如通过自动完成(代码完成)自动关闭标签。
在本文中,我们将创建自动完成 HTML 标签的功能。
下载源代码以查看简单和高级的 HTML 标签完成功能。
Procedure
步骤 1:在 C# 中创建 Windows Forms 应用程序。
步骤 2:将 RichTextBox 拖放到该窗体上。
步骤 3:为 RichTextBox 添加 KeyPress 和 KeyDown 事件。
使用代码
首先声明变量
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# 中创建自动完成,
编码与上述文章链接中定义的一样,只是添加了 AutoComplete HTML 标签功能并修改了内容。
下载源代码以查看带有自动完成功能的自动 html 标签完成。
借助自动完成功能,您可以直接从弹出的列表中选择标签,并且只需按“>”键即可完成它们。
我在源代码中创建了 ACHTMLTags.cs (AutoCompleteHTMLTags) 类。