C# WPF 有助于 1. 删除列表框中的前两个条目或 2. 阻止它在输出中显示来自批处理的命令语法
C# WPF help in either 1. removing first two entries in listbox or 2. preventing it from displaying the command syntax from batch in output
这是我在 window_loaded 事件期间在我的 wpf 中调用的代码片段。它将执行一个批处理文件,并将结果输出到列表框中。但是,列表框中的第一个条目显示了批处理文件中的命令本身。我想删除第一个条目,或者如果不能以有效的方式完成,则首先阻止它显示它。
我试过使用项目计数删除,但它抛出了参数不足的异常。我有根据的猜测是,尽管它试图在 window_loaded 中添加项目,但直到 window 实际完成加载后它才完成添加。因此,当我调用从索引计数中删除项目的语法时,它会抛出该错误,因为此时列表框仍为空。那么我如何在 window 加载时添加数据,一旦完成添加数据,从批处理中删除包含语法的第一个条目或阻止它显示第一个条目。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var info = new ProcessStartInfo("extractServiceList.bat") { UseShellExecute = false, RedirectStandardOutput = true };
var proc = new Process { StartInfo = info, EnableRaisingEvents = true };
proc.OutputDataReceived += (obj, args) =>
{
if (args.Data != null)
{
this.Dispatcher.Invoke(() =>
{
listBoxServices.Items.Add(args.Data);
//below logic for removing whitespaces from listbox view
int count = listBoxServices.Items.Count;
for (int i = count - 1; i >= 0; i--)
{
//Condition evaluating to see if it return true for = listbox items empty and
//looping through each entry to remove the whitespace entry
if (String.IsNullOrWhiteSpace(listBoxServices.Items[i].ToString()))
{
listBoxServices.Items.RemoveAt(i);
}
}
//end of logic above for removing whitespaces from listbox view
});
//listBoxServices.Items.RemoveAt(listBoxServices.Items.Count - 1);
}
};
proc.Start();
proc.BeginOutputReadLine();
}
也许你可以收集所有输出,先检查并添加到输出如果不是空格。然后,在 Exited
事件中添加到列表框。这是一个命令行示例,但如果您替换 Exited
事件处理程序,它应该可以在 WPF 中使用。
List<string> output = new List<string>();
proc.OutputDataReceived += (obj, args) =>
{
if (args.Data != null)
{
if (String.IsNullOrWhiteSpace(args.Data))
return;
output.Add(args.Data);
}
};
proc.Exited += (s, args) =>
{
foreach (var o in output)
Console.WriteLine(o);
}
这是我在 window_loaded 事件期间在我的 wpf 中调用的代码片段。它将执行一个批处理文件,并将结果输出到列表框中。但是,列表框中的第一个条目显示了批处理文件中的命令本身。我想删除第一个条目,或者如果不能以有效的方式完成,则首先阻止它显示它。
我试过使用项目计数删除,但它抛出了参数不足的异常。我有根据的猜测是,尽管它试图在 window_loaded 中添加项目,但直到 window 实际完成加载后它才完成添加。因此,当我调用从索引计数中删除项目的语法时,它会抛出该错误,因为此时列表框仍为空。那么我如何在 window 加载时添加数据,一旦完成添加数据,从批处理中删除包含语法的第一个条目或阻止它显示第一个条目。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var info = new ProcessStartInfo("extractServiceList.bat") { UseShellExecute = false, RedirectStandardOutput = true };
var proc = new Process { StartInfo = info, EnableRaisingEvents = true };
proc.OutputDataReceived += (obj, args) =>
{
if (args.Data != null)
{
this.Dispatcher.Invoke(() =>
{
listBoxServices.Items.Add(args.Data);
//below logic for removing whitespaces from listbox view
int count = listBoxServices.Items.Count;
for (int i = count - 1; i >= 0; i--)
{
//Condition evaluating to see if it return true for = listbox items empty and
//looping through each entry to remove the whitespace entry
if (String.IsNullOrWhiteSpace(listBoxServices.Items[i].ToString()))
{
listBoxServices.Items.RemoveAt(i);
}
}
//end of logic above for removing whitespaces from listbox view
});
//listBoxServices.Items.RemoveAt(listBoxServices.Items.Count - 1);
}
};
proc.Start();
proc.BeginOutputReadLine();
}
也许你可以收集所有输出,先检查并添加到输出如果不是空格。然后,在 Exited
事件中添加到列表框。这是一个命令行示例,但如果您替换 Exited
事件处理程序,它应该可以在 WPF 中使用。
List<string> output = new List<string>();
proc.OutputDataReceived += (obj, args) =>
{
if (args.Data != null)
{
if (String.IsNullOrWhiteSpace(args.Data))
return;
output.Add(args.Data);
}
};
proc.Exited += (s, args) =>
{
foreach (var o in output)
Console.WriteLine(o);
}