C#如果满足条件,如何使用RichTextBox中的字符串填充ComboBox

问题描述 投票:0回答:2

我正在尝试用富文本框中的行填充组合框。但是,仅当富文本框中的行的最后6个字符包含字符串“ device”时。我不知道富文本框中的行数以及包含字符串“ device”的行数,直到运行时为止。

假设组合框中有6行,其中2个包含字符串“ device”。但是两个数字都可以并且在运行期间确实会发生变化。

int IntCountLines等于富文本框中的行数。int IntNumberOfDevices等于在富文本框中包含字符串“ device”(最后6个字符)的行数。

富文本框中的第一行[0]始终被忽略。因此,从第[1]行开始。

如果富文本框中的第1行包含字符串“ device”,我想将其添加到组合框中。如果没有,请移至第2行并进行检查。如果其中包含字符串“ device”,则将其添加到组合框。如果不是,请移至第3行,依此类推。

int IntCountLines

int IntNumberOfDevices。

Richtextbox名称是:RtxtAdbOutput。

组合框名称是:CmbIP。

我有:

StrTmpOutput = rtxtAdbOutput.Lines[1].Substring(rtxtAdbOutput.Lines[1].Length - 6);

if (StrTmpOutput == "device")
{
    CmbIPs.Items.Add(rtxtAdbOutput.Lines[1].Remove(rtxtAdbOutput.Lines[1].Length - 7));
}



StrTmpOutput = rtxtAdbOutput.Lines[2].Substring(rtxtAdbOutput.Lines[2].Length - 6);

if (StrTmpOutput == "device")
{
    CmbIPs.Items.Add(rtxtAdbOutput.Lines[2].Remove(rtxtAdbOutput.Lines[2].Length - 7));
}


StrTmpOutput = rtxtAdbOutput.Lines[3].Substring(rtxtAdbOutput.Lines[3].Length - 6);

if (StrTmpOutput == "device")
{
    CmbIPs.Items.Add(rtxtAdbOutput.Lines[3].Remove(rtxtAdbOutput.Lines[3].Length - 7));
}

依此类推。但是直到运行时才知道行数,这意味着我不知道要进行多长时间的if语句添加。另外,如果它是空行,它将给出错误(因为它试图从不存在的字符串的末尾剥离7个字符,尽管我可以进行一些错误检查以阻止它)。

有什么方法可以通过for循环或类似的方法来改善它吗?

我想一直这样做,直到添加到组合框中的行数与IntNumberOfDevices的值匹配为止。

c# loops combobox richtextbox
2个回答
0
投票

我正在尝试用富文本框中的行填充组合框。但是,仅当富文本框中的行的最后6个字符包含字符串“ device”时。我不知道富文本框中的行数以及包含字符串“ device”的行数,直到运行时为止。

为此,您首先需要获取控件中字符串的某种集合。为此,您可以创建一个函数以将这些行取回。

 private static List<string> GetRTFLines(RichTextBox rtf) => new TextRange(rtf.Document.ContentStart, rtf.Document.ContentEnd).Text.Split('\n').Where(line => !string.IsNullOrEmpty(line) && line.Replace("\r","").EndsWith("device")).Select(field => field.Replace("\r", "").Replace("device", "")).ToList();

呼叫此:

 var lines = GetRTFLines(rtxtAdbOutput);

总计:

var lines = GetRTFLines(rtxtAdbOutput); //get your list of lines that meet the criteria
            // add them to the combobox if they haven't been
  lines?.ForEach(line =>
                {
                   if (!CmbIPs.Items.Contains(line))
                          CmbIPs.Items.Add(line);
                }
            );

如果要计数,lines变量具有该值。


-1
投票

您可以同时使用List<T>.ForEach()方法和String.EndsWith()

rtxtAdbOutput.Lines.ToList()
    .GetRange(1, rtxtAdbOutput.Lines.Count() - 1)
    .Where(line => line.EndsWith("device")).ToList()
    .ForEach(validLine => CmbIPs.Items.Add(validLine.Remove(validLine.Length - 7));

这是将所有索引大于0的行作为列表,然后使用String.EndsWith选择以“ device”结尾的行,然后使用ForEach()将它们分别添加到组合框中]。

DotnetFiddle demonstrating it

String.EndsWith documentation

List.ForEach documentation

© www.soinside.com 2019 - 2024. All rights reserved.