使用项目填充listview时如何删除不需要的空格(c#)

时间:2013-11-26 17:41:47

标签: c# winforms

使用c#,winforms。

背景

用户应该能够从菜单条中选择项目,然后根据列表视图列进行填充。示例:从100-80%中选择百分比,然后填充第1列和第2列。从< 1000中选择total trans,然后填充第3列和第4列。

问题:

在我的列表视图中添加项目时,请说我从菜单条中选择选项1。第1列和第2列填满。好。但是,如果我从总反转中选择选项,那么第3列和第4列就会被填满,但是列中有大量的WHITEspace。基本上,填充时列不应有空格。

这就是我的意思:注意空白(用红色勾勒出来)。首先我选择了选项1,然后一旦我选择填充第3列和第4列的选项,它们就会填充,但是只有空格。第3列和第4列的列值在白色上应该没有任何值。

enter image description here

此处:我从菜单条中选择了另一个选项(第1列和第2列),选择了填充第3列和第4列的选项,以及更多空格:

enter image description here

代码:

   // Fill Column 1 and 2 from option 1
   private void toolStripMenuItem2_Click(object sender, EventArgs e)
          {

              int totItems = Seq3.Count - 1;
              if (PercentPopTolerance1.Count - 1 > totItems) totItems = PercentPopTolerance1.Count - 1;

              for (int i = 0; i <= totItems; i++)
              {
                  ListViewItem lvi = new ListViewItem();
                  string item1 = "";
                  string item2 = "";


                  if (Seq3.Count - 1 >= i) item1 = Seq3[i].ToString();
                  if (PercentPopTolerance1.Count - 1 >= i) item2 = PercentPopTolerance1[i].ToString();

                  lvi.SubItems.Add(item1);
                  lvi.SubItems.Add(item2);



                  listView2.Items.Add(lvi);
              }

          }

          // Percent tolerance from 80-60%
          // Fill Column 1 and 2 from option 2

          private void toolStripMenuItem3_Click_1(object sender, EventArgs e)
          {

              ClearColumn("columnHeader5");

              int totItems = Seq4.Count - 1;
              if (PercentPopTolerance2.Count - 1 > totItems) totItems = PercentPopTolerance2.Count - 1;

              for (int i = 0; i <= totItems; i++)
              {
                  ListViewItem lvi = new ListViewItem();
                  string item1 = "";
                  string item2 = "";


                  if (Seq4.Count - 1 >= i) item1 = Seq4[i].ToString();
                  if (PercentPopTolerance2.Count - 1 >= i) item2 = PercentPopTolerance2[i].ToString();

                  lvi.SubItems.Add(item1);
                  lvi.SubItems.Add(item2);



                  listView2.Items.Add(lvi);
              }
          }

 // Fill columns 3 and 4 from option in total trans menustrip
 // Total trans tolerance < 1000

          private void etcToolStripMenuItem_Click(object sender, EventArgs e)
          {

              int totItems = YYMMt21.Count - 1;
              if (TotalTransIrregularitiest21.Count - 1 > totItems) totItems = TotalTransIrregularitiest21.Count - 1;

              for (int i = 0; i <= totItems; i++)
              {
                  ListViewItem lvi = new ListViewItem();
                  string item1 = "";
                  string item2 = "";


                  if (YYMMt21.Count - 1 >= i) item1 = YYMMt21[i].ToString();
                  if (TotalTransIrregularitiest21.Count - 1 >= i) item2 = TotalTransIrregularitiest21[i].ToString();

                  // Skip first 2 columns
                  lvi.SubItems.Add(string.Empty);
                  lvi.SubItems.Add(string.Empty);

                  lvi.SubItems.Add(item1);
                  lvi.SubItems.Add(item2);



                  listView2.Items.Add(lvi);
              }
          }

编辑:尝试用户建议:

出现了新的问题:在第3列和第4列中应该是垂直填充listview从第一行水平填充: enter image description here

我的尝试:

   private void etcToolStripMenuItem_Click(object sender, EventArgs e)
          {

              int totItems = YYMMt21.Count - 1;
              if (TotalTransIrregularitiest21.Count - 1 > totItems) totItems = TotalTransIrregularitiest21.Count - 1;

              for (int i = 0; i <= totItems; i++)
              {
                  ListViewItem lvi = new ListViewItem();
                  string item1 = "";
                  string item2 = "";


                  if (YYMMt21.Count - 1 >= i) item1 = YYMMt21[i].ToString();
                  if (TotalTransIrregularitiest21.Count - 1 >= i) item2 = TotalTransIrregularitiest21[i].ToString();

                  // Skip first 2 columns
                  lvi.SubItems.Add(string.Empty);
                  lvi.SubItems.Add(string.Empty);


                  int rowToPopulate = 0;
                  int colToPopulate = 0;

                  if (rowToPopulate <= listView2.Items.Count - 1)
                  {
                      //Editing an existing row/ListViewItem
                      listView2.Items[rowToPopulate].SubItems.Insert(colToPopulate, new ListViewItem.ListViewSubItem() { Text = item1 });

                       // How would I also add item2?
                       // listView2.Items[rowToPopulate].SubItems.Insert(colToPopulate, new ListViewItem.ListViewSubItem() { Text = item2 });
                  }
                  else
                  {
                      //Adding a new row/ListViewItem
                     // ListViewItem lvi = new ListViewItem();
                      lvi.SubItems.Add(item1);
                      lvi.SubItems.Add(item2);
                      //Add all the other Subitems as usual

                      listView2.Items.Add(lvi);
                  }



                  //listView2.Items.Add(lvi);
              }
          }

2 个答案:

答案 0 :(得分:2)

您可以替换Items.AddItems.SubItems.Insert。示例代码:

string curItem = "curVal";    
int rowToPopulate = 0;
int colToPopulate = 0;

if (rowToPopulate <= listView2.Items.Count - 1)
{
    //Editing an existing row/ListViewItem
    listView2.Items[rowToPopulate].SubItems.Insert(colToPopulate, new ListViewItem.ListViewSubItem() { Text = curItem });
}
else
{
    //Adding a new row/ListViewItem
    ListViewItem lvi = new ListViewItem();
    lvi.SubItems.Add(curItem);
    //Add all the other Subitems as usual

    listView2.Items.Add(lvi);
}

此代码检查是否已填充正在分析的行(rowToPopulate)。如果尚未填充,则可以使用到目前为止的代码(在else statement下,包括尽可能多的SubItems作为列,只留空没有可用信息的代码)。如果这是您第二次分析此行(某些列已经填充并且其他一些列留空),则采用给定的ListViewItem /行(listView2.Items[rowToPopulate])并插入新元素在您希望的SubItem /列中。

答案 1 :(得分:1)

从我在代码中可以看出,你只是在事件上添加更多项目,为你想要跳过的列提供String.Empty。如果您希望下一个事件的新值与已存在的值显示在同一行上,则必须更新已存在的行SubItems并提供哪些值将在哪一行上进行。

编辑:我完成了您尝试使用以下示例所做的事情。这假设您知道或可以获得您尝试添加到每列的每个列表的大小。您必须实现一些空检查等,以确保您没有引用列表中的空单元格。只需扩展此示例并根据您的具体情况进行定制。

List<string> sList = new List<string>() { "1", "2", "3", "4", "5" };

List<string> lList = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8" };

private void button1_Click(object sender, EventArgs e)
{
    listView1.Clear();
    addColumns();
    for (int i = 0; i < sList.Count(); i++)
    {
        var item1 = new ListViewItem(sList[i]);
        item1.SubItems.Add(String.Empty);
        listView1.Items.Add(item1);
    }
}

private void button2_Click(object sender, EventArgs e)
{
    listView1.Clear();
    addColumns();
    for (int i = 0; i < lList.Count(); i++)
    {
        if (i < sList.Count())
        {
            var item2 = new ListViewItem(sList[i]);
            item2.SubItems.Add(lList[i]);
            listView1.Items.Add(item2);
        }
        else
        {
            var item3 = new ListViewItem(String.Empty);
            item3.SubItems.Add(lList[i]);
            listView1.Items.Add(item3);
        }
    }
}

private void addColumns()
{
    listView1.Columns.Add("Column 1", -2, HorizontalAlignment.Left);
    listView1.Columns.Add("Column 2", -2, HorizontalAlignment.Left);
}