【问题标题】:Insert values into listview from multiple arrays C#从多个数组C#将值插入列表视图
【发布时间】:2014-04-28 11:21:01
【问题描述】:

所以我有 4 个数组,它们包含名字、姓氏、用户名和访问类型(读、读/写、无)。我需要将这些数组中的值插入到具有 34 列的列表视图中,前 3 列对应于前 3 个数组,其余的需要包含这些用户的访问类型(列标题是他们可以访问的文件夹名称或不)。我的问题在于访问类型数组。 如何将每行的 31 个值从访问类型数组中插入到列表视图中?访问数组中的前 31 个值对应于第一个用户名,接下来的 31 个值对应于第二个用户名,依此类推。到目前为止,我已经像这样插入了前 3 个数组:

for (int i = 0; i < rows; i++)
{
    list.Items.Add(new ListViewItem(new string[] { fname[i], lname[i], uname[i] }));   
}

这会添加所有用户。

不知道如何插入其他值...

【问题讨论】:

  • 请提供数组样本。目前尚不清楚您如何将不同用户的数据保存在访问类型数组中
  • @Sergey Berezovskiy 所有数组都是从数据库中填充的,数据是根据用户名获取的。所以我要说的是,访问数组中的值的顺序对应于用户名数组中用户名的顺序,以 31 个值为一组。

标签: c# .net arrays winforms listview


【解决方案1】:

假设您的最后一个数组名为 accesslist,并假设每个用户正好有 31 个值,这会起作用,尽管它会变得很长。

for (int i = 0; i < rows; i++)
{
    list.Items.Add(new ListViewItem(new string[] { fname[i], lname[i], uname[i],
        accesslist[0 + (i * 31)], accesslist[1 + (i * 31)], ... , accesslist[30 + (i * 31)] }));   
}

相反,在循环内创建一个字符串数组,并通过迭代 accesslist 来填充它:

for (int i = 0; i < rows; i++)
{
    var items = new string[34];

    items[0] = fname[i];
    items[1] = lname[i];
    items[2] = uname[i];

    for (int j = 0; j < 31; j++)
        items[j + 3] = accesslist[j + (i * 31)];

    list.Items.Add(new ListViewItem(items));
}

【讨论】:

  • 好的,所以我正在尝试使用您的第二种方法,而您在将每个项目插入列表视图时忘记循环遍历它。虽然我已经这样做了,但所有值都只插入第一列。如何在列表视图的相应列中插入值?
  • 但问题是我们应该避免 foreach 循环...该实现没有任何缺陷,但我们应该尽量避免循环..
【解决方案2】:

将您的 “访问类型” 数组转换为列表。创建一个具有这 31 个值的类并列出该类。那么你的工作会更快,也会减少。

public class accessType
{

public String prop1{get;set;}
public String prop2{get;set;}
public String prop3{get;set;}
.
.
.
public String prop31{get;set;}

}

现在列出类:

List<accessType> accessType=new List<accessType>();

然后在这里你绑定你的列表视图:

Int32 i=0;
 accessType.ForEach(x=>
                lstViewTest.Items.Add(new ListViewItem{fname[i],lname[i],uName[i],x.prop1,x.prop2,x.prop3,....,x.prop31}); i++ 
                    );

【讨论】:

    【解决方案3】:

    有点像.....

    for (int i = 0; i < rows; i++)
    {
        list.Items.Add(new ListViewItem(new string[] { fname[i], lname[i], uname[i], accesstype[i * 31], accesstype[i * 31 + 1], etc, etc, ..., accesstype[i * 31 + 30] }));   
    }
    

    【讨论】:

      【解决方案4】:

      上面的问题还有另一个示例解决方案。

      String[] firtNames = new String[] { "abc", "def", "ghi", "jkl" };
      String[] lastNames = new String[] { "mno", "pqr", "stu", "vwx" };
      String[] userNames = new String[] { "gb", "aa", "ss", "am" };
      String[] actions = new String[] { "Get", "Set", "Submit", "Get", "Set", "Submit","Get","Set", "Submit", "Get", "Set", "Submit" };
      
      Int32 counter = 31;
       var p = firtNames.Select((col, index) => new { FirstName = col, LastName = lastNames[index], UserName = userNames [index] , a1 = actions[index * counter], a2 = actions[index * counter + 1],..., a31 = actions[index * counter + 30] }).ToList();
              ListView1.DataSource = p;
              ListView1.DataBind();
      

      将网格视图列与您在此处提到的名称绑定为 FirstName、LastName。

      【讨论】:

      • 我试图避免手动输入所有这 31 个项目,因为我已将该数字设置为将来可能会更改的变量,因此我需要循环访问它们。但无论如何感谢您的回答。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 2019-10-02
      • 1970-01-01
      • 2011-12-16
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多