簡體   English   中英

C#從文本文件寫入listView

[英]C# Write from text file to listView

我用C#創建了Windows應用程序,該應用程序從文本文件寫入listView。 我首先在cmd中執行命令以列出手機中的系統和用戶應用程序,然后將cmd輸出放入文本文件。 現在,我想將文本文件的內容添加到listView中:應該列出第一列中的/ system / app中的應用程序,第二列中的/ system / priv-app中的應用程序以及第三遍/ data / app的應用程序! 當我按下按鈕執行功能時,出現錯誤:System.ArgumentException:無法在多個地方添加或插入項目“。 您必須首先將其從其當前位置刪除或克隆它。

Process  process;
ProcessStartInfo startInfo;
private void Form1_Load(object sender, EventArgs e)
{
    process = new Process();
    startInfo = new ProcessStartInfo();
    startInfo.FileName = "cmd.exe";
    startInfo.ErrorDialog = false;
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.Arguments = "/C adb devices&adb shell pm list packages -f";
}

private void Redirect_ADB_Output()
{
    using (Process process = Process.Start(startInfo))
    {
        using (StreamReader reader = process.StandardOutput)
        {
            string result = reader.ReadToEnd();
            File.WriteAllText("ADB.txt", result);
        }
    }   
}

private void WriteToListView()
{
    ListViewItem lvItem = new ListViewItem();
    var lines = File.ReadLines("ADB.txt");
    foreach (var line in lines)
        {
            ListViewItem lvItem = new ListViewItem();
            if (line != string.Empty)
            {
                var newLine = line.Remove(0, 8);

                if (line.Contains("package:/system/app"))
                {
                    ApkList.Items.Add(newLine);
                }
                if (line.Contains("package:/system/priv-app"))
                {
                    lvItem.SubItems.Add(newLine);
                }
                if (line.Contains("package:/data/app"))
                {
                    lvItem.SubItems.Add(newLine);
                }
            }
            ApkList.Items.Add(lvItem);
        }
    File.WriteAllText("ADB.txt", string.Empty);
}

private void btn_PullApkFromPhone_Click(object sender, EventArgs e)
{
    startInfo.Arguments = "/C adb devices&adb shell pm list packages -f";
    Redirect_ADB_Output();

    WriteToListView();
}

我認為這可能是因為您在循環訪問元素時正在對其進行修改。

嘗試創建一個新對象並將其添加到集合中(也正如另一個用戶指出的那樣,嘗試將ListView移到foreach循環中):

foreach (var line in lines)
{
    ListViewItem lvItem = new ListViewItem();

    var newLine = line.Remove(0, 8);

    if (line.StartsWith("package:/system/app"))
    {
        ApkList.Items.Add(newLine);
    }
    if (line.StartsWith("package:/system/priv-app"))
    {
        lvItem.SubItems.Add(newLine);
    }
    if (line.StartsWith("package:/data/app"))
    {
        lvItem.SubItems.Add(newLine);
    }
    ApkList.Items.Add(lvItem);
}

我建議先添加“列”,這會有所幫助。

ListViewItem lvItem = new ListViewItem();
ApkList.View = View.Details;
ApkList.Columns.Add("Col1");
ApkList.Columns.Add("Col2");
ApkList.Columns.Add("Col3");

然后,您需要在foreach上執行此操作。

foreach (var line in lines)
{
  if (line != string.Empty)
  {
      var newLine = line.Remove(0, 8);

      if (line.Contains("package:/system/app"))
      {
          lvItem.Text = newLine;
      }
      if (line.Contains("package:/system/priv-app"))
      {
          lvItem.SubItems.Add(newLine);
      }
      if (line.Contains("package:/data/app"))
      {
          lvItem.SubItems.Add(newLine);
      }
   }            
}

ApkList.Items.Add(lvItem);

然后,您需要圍繞上面的最后一個循環,foreach,同時填充整個列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM