二进制文件填充DataGridView仅生成行列无内容的解决方法
解决DataGridView绑定二进制读取数据后单元格无内容的问题
问题根源分析
你的代码能生成正确行数但单元格无数据,核心原因通常有两个:
- Cliente类属性访问权限不足:DataGridView仅能绑定公共(
public)属性,若你的Cliente类字段是私有或内部访问级别,控件无法读取数据。 - ArrayList是弱类型数据源:ArrayList存储的是
object类型,DataGridView无法自动识别Cliente的属性信息,导致绑定失效。
具体修复步骤
1. 确保Cliente类的属性为公共可访问
检查并修改Cliente类定义,必须将属性声明为public,示例如下:
public class Cliente { public string codigoCliente { get; set; } public string nome { get; set; } public string nif { get; set; } public string email { get; set; } public Cliente(string codigo, string nome, string nif, string email) { this.codigoCliente = codigo; this.nome = nome; this.nif = nif; this.email = email; } }
2. 将ArrayList替换为强类型的List
把原来的clientes变量类型从ArrayList改为List<Cliente>,强类型数据源能让DataGridView更准确地识别属性:
// 替换原来的ArrayList声明 private List<Cliente> clientes = new List<Cliente>();
3. 优化DataGridView绑定逻辑
设置DataSource前先重置为null,确保控件强制刷新:
dataGridViewClientes.DataSource = null; dataGridViewClientes.DataSource = clientes;
修复后的完整代码片段
private void button3_Click(object sender, EventArgs e) { using (OpenFileDialog localizarArquivoDialog = new OpenFileDialog()) { localizarArquivoDialog.Filter = "Arquivos Binários (*.bin)|*.bin"; localizarArquivoDialog.DefaultExt = "bin"; DialogResult resultado = localizarArquivoDialog.ShowDialog(); if (resultado == DialogResult.OK) { caminhoArquivo = localizarArquivoDialog.FileName; // 清空强类型列表 clientes.Clear(); using (FileStream fs = new FileStream(caminhoArquivo, FileMode.Open)) { using (BinaryReader reader = new BinaryReader(fs)) { while (reader.BaseStream.Position < reader.BaseStream.Length) { string codigoCliente = reader.ReadString(); string nome = reader.ReadString(); string nif = reader.ReadString(); string email = reader.ReadString(); Cliente cliente = new Cliente(codigoCliente, nome, nif, email); clientes.Add(cliente); } } } // 配置DataGridView列 dataGridViewClientes.AutoGenerateColumns = false; dataGridViewClientes.Columns.Clear(); dataGridViewClientes.Columns.Add("codigoCliente", "Código Cliente"); dataGridViewClientes.Columns["codigoCliente"].DataPropertyName = "codigoCliente"; dataGridViewClientes.Columns.Add("nome", "Nome"); dataGridViewClientes.Columns["nome"].DataPropertyName = "nome"; dataGridViewClientes.Columns.Add("nif", "NIF"); dataGridViewClientes.Columns["nif"].DataPropertyName = "nif"; dataGridViewClientes.Columns.Add("email", "Email"); dataGridViewClientes.Columns["email"].DataPropertyName = "email"; // 重置并绑定数据源 dataGridViewClientes.DataSource = null; dataGridViewClientes.DataSource = clientes; } else { caminhoArquivo = ""; MessageBox.Show("Nenhum arquivo selecionado."); } } }
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

