Winform控件学习杂记

120 阅读2分钟

ListView控件学习

1. ListView1控件包含五种视图模式(Details、LargeIcon、List、SmallIcon和Tile),最常用的是Details,它以表格形式展示数据,包括列与行。 可以在控件上的“编辑列”中设置列名,也可以使用 listView1.Columns.Add()方法添加列名;之后可以在“编辑项”中设置项,每一行即为Listview1的Item(项),每行中的每格及后续格为Item的subitems(项中的数据)

2. listView1.SelectedIndices返回当前所选中的项的索引集合(listView1_SelectedIndexChanged事件在每次点击项时,会一共触发两次,第一次先清空之前选中索引的集合,第二次再把当前选中项的索引存入集合中)。

//所以要避免事件重复触发时的报错,应该先判断当前索引集合是否为空
if (listView1.SelectedIndices.Count > 0)
{
    //返回选中项的第一个索引
    var selectedIndex = listView1.SelectedItems[0];
    //SelectedItems[0].Text与SelectedItems[0].SubItems[0].Text显示的内容是一样的,都是该行第一格
    //中的内容
}

3. listView1的Tag属性可以把一个类的实例赋值给它(Item与SubItem都有该属性)

//在选中项时,依旧需要先判断
if(listView1.SelectedItems.Count > 0)
{
    ListViewItem myItem = listView1.SelectedItesms[索引];
    //之后可以通过类型转换或者as,将myItem转为当初给Tag赋值的类
}

4. listView的其他常用属性、方法与“分组”的使用

DataGridView控件

dgv控件的datasource属性接收的只是一个简单的表,当源数据中某列为某个类,而dgv控件需要显示这个类中的某个信息时,则需要通过LINQ重新创建一个新表,新表为dgv需要显示的全部信息。

public class ClassAAA
{
    public int Index { get; set; }
    public string Name { get; set; }
    public ClassBBB Bbb { get; set; }
}
public class ClassBBB
{
    public int Bindex { get; set; }
    public string  Bname { get; set; }
}

public partial class Form1 : Form
{
    
    public Form1()
    {
        InitializeComponent();
        dataGridView1.AutoGenerateColumns = false;
        //如果不通过LINQ,在ClassBBB中的属性就无法显示出来
        dataGridView1.DataSource = LoadData().Select(s => new
        {
            Index = s.Index,
            Name = s.Name,
            Bindex = s.Bbb.Bindex,
            Bname = s.Bbb.Bname,
        }).ToList();
    }

    private List<ClassAAA> LoadData()
    {
        var aaaList = new List<ClassAAA>();
        for (int i = 0; i < 5; i++)
        {
            ClassAAA  classAAA = new ClassAAA();
            classAAA.Index = i;
            classAAA.Name = "AAA" + i;
            classAAA.Bbb = new ClassBBB() { Bindex = i + 1, Bname = "BBB" + (i + 1) };
            aaaList.Add(classAAA);
        }
        return aaaList;
    }
}

从DataGridView控件导出excel

static void ExportExcelFromDGV(DataGridView dgv,string path)
{
    var workBook = new XSSFWorkBook();
    var sheet = workBook.CreatSheet("命名导出的表")
    
    //第一行为列名
    IRow headerRow = sheet.CreatRow(0);
    for(i = 0,i < dgv.Colmuns.Count,i++)
    {
        ICell headerCell = headerRow.CreatCell(i);
        headerCell.SetValue(dgv.Columns[i].HeaderText);
    }
    
    //行的序号从1开始,将数据复制到工作表中
    for(i = 1,i < dgv.Colmuns.Count,i++)
    {
        IRow row = sheet.CreatRow(i);
        for(j = 0,j < dgv.Colmnus.Count,j++)
        {
            ICell cell = row.CreatCell(j);
            cell.SetValue = (dgv.Rows[i].Cells[j].Value.ToString());
        }
    }
    
    using(FileStream fs = new FileStream(path,FileMode.CreateNew,FileAccess.Write))
    {
        workBook.Write(fs);
    }
}