在文本更改 c# 上创建首字母缩略词

时间:2021-02-01 20:30:01

标签: c# winforms textchanged

我正在尝试在文本更改时使用标题文本框制作首字母缩略词 但是每当我按空格时我都会收到错误消息 我得到的错误是

<块引用>

System.ArgumentOutOfRangeException: '索引和长度必须引用一个 字符串中的位置。参数名称:长度'

  • 这是我的表单的样子: GUI

  • 这是我的代码的样子:

    private void txtTitle_TextChanged(object sender, EventArgs e)
        {
            txtARC.Text = "";
            if (!String.IsNullOrEmpty(txtTitle.Text))
            {
                string word = txtTitle.Text.ToString();
                string[] wordArry = word.Split(' ');
                for(int i=0; i<wordArry.Length; i++)
                {
                    txtARC.Text = wordArry[i].Substring(0, 1);
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

如果输入框中的文字是"some words and a space ", 那么 wordArry 将包含字符串 "some", "words", "and", "a," "space", ""。注意末尾的空字符串!当您尝试获取空字符串的第一个字符时,会出现异常。

您可以在这里做几件事。

您可以指示 string.Split() 忽略那些空字符串:

string[] wordArry = word.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

您可以检查对 Substring 的调用范围:

wordArry[i].Substring(0, Math.Min(1, wordArry[i].Length))

或者你可以在循环中跳过空字符串,就像这样

for (int i = 0; i < wordArry.Length; i++)
{
    if(string.IsNullOrEmpty(wordArry[i])) {
        continue;
    }

    // Process the string here  
} 

答案 1 :(得分:0)

让我们提取方法 - ToAcronym;我们可以使用正则表达式来实现它:我们可以Match所有单词(我们定义为非空字母序列)并从每个单词中取出第一个字符词:

代码:

  using System.Linq;
  using System.Text.RegularExpressions;

  ...

  public static string ToAcronym(string value) {
    if (string.IsNullOrWhiteSpace(value))
      return "";

    return string.Concat(Regex
      .Matches(value, @"\p{L}+")
      .Cast<Match>()
      .Select(match => match.Value[0]));
  }

演示:

  string[] tests = new string[] {
    "Quick Brown Fox",
    "word",
    "Два Слова", // "Two Words" in Russian
    "Have (Some) Punctuation!"
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,-25} => {ToAcronym(test)}"));

  Console.Write(report);

结果:

Quick Brown Fox           => QBF
word                      => w
Два Слова                 => ДС
Have (Some) Punctuation!  => HSP

您的代码可以

  private void txtTitle_TextChanged(object sender, EventArgs e) {
    txtARC.Text = ToAcronym(txtTitle.Text);
  }