如何自定义BindingSource绑定List的DataGridView列,仅显示Word列
让DataGridView仅显示Word列的解决方案
你目前混淆了BindingSource.Filter的作用——它用于筛选数据行(过滤不符合条件的行),而非控制列的显示。要让DataGridView只展示Word列,有以下几种可行方案:
方案1:绑定数据源后手动隐藏多余列
在给DataGridView绑定数据源后,遍历所有列,将除Word外的列设置为不可见:
private void button1_Click(object sender, EventArgs e) { AlbumsDAO albumsDAO = new AlbumsDAO(); kelimes = albumsDAO.getAllKelimes(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, Convert.ToInt32(birNUD.Value), Convert.ToInt32(ikiNUD.Value), Convert.ToInt32(ucNUD.Value), birHarfTB.Text, ikiHarfTB.Text, ucHarfTB.Text); kelimesBindingSource.DataSource = kelimes; dataGridView1.DataSource = kelimesBindingSource; // 隐藏非Word列 foreach (DataGridViewColumn column in dataGridView1.Columns) { if (column.DataPropertyName != "Word") { column.Visible = false; } } }
方案2:通过设计器预先配置列
打开WinForms设计器,给DataGridView添加单独一列:
- 设置该列的
DataPropertyName为Word - 删除或隐藏设计器中自动生成的其他列
绑定数据源后,DataGridView就只会显示这一列。
方案3:转换为仅含Word属性的数据源
将List<Kelime>转换为只包含Word属性的匿名对象列表,再绑定到BindingSource,从根源上减少数据源的属性:
private void button1_Click(object sender, EventArgs e) { AlbumsDAO albumsDAO = new AlbumsDAO(); kelimes = albumsDAO.getAllKelimes(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text, textBox7.Text, textBox8.Text, textBox9.Text, textBox10.Text, Convert.ToInt32(birNUD.Value), Convert.ToInt32(ikiNUD.Value), Convert.ToInt32(ucNUD.Value), birHarfTB.Text, ikiHarfTB.Text, ucHarfTB.Text); // 转换为仅含Word的匿名对象列表 var wordList = kelimes.Select(k => new { k.Word }).ToList(); kelimesBindingSource.DataSource = wordList; dataGridView1.DataSource = kelimesBindingSource; }
补充说明
如果后续需要保留原Kelime对象的完整数据(比如做其他操作),优先选方案1或方案2;如果只需要展示Word,方案3更简洁高效。
内容的提问来源于stack exchange,提问作者egem
相关产品推荐
相关产品推荐

