如何不依赖字符串索引DataRow列?寻求DataTable列非字符串索引方案
解决DataRow字符串索引编译时无法验证的问题
针对你遇到的字符串索引列容易拼写错误、只能运行时发现的问题,有几种靠谱的非字符串索引方案:
1. 直接使用DataColumn对象索引
提前从DataTable的Columns集合中获取对应列的DataColumn实例,用这个对象作为索引访问DataRow,编译时就能依托IDE提示提前发现列名拼写问题,就算运行时出错也会暴露在列初始化阶段,而非遍历行的时候:
// 提前在类或方法开头获取列对象(只需一次) DataColumn colFoo = MyDataTable.Columns["foo"]; DataColumn colBar = MyDataTable.Columns["bar"]; foreach (DataRow dr in MyDataTable.Rows) { MyDataGridView.Rows.Add(dr[colFoo].ToString(), dr[colBar].ToString()); }
如果你的MyDataTable是通过数据集设计器生成的强类型表,还能直接用MyDataTable.Columns.Foo这种方式获取列,连字符串常量都不用写。
2. 定义列名字符串常量
如果暂时不想大幅改动现有代码,可以把所有列名定义成const string常量集中管理。虽然本质还是字符串,但至少避免了重复拼写错误,后续改列名时只需修改一处常量定义:
private const string ColumnFoo = "foo"; private const string ColumnBar = "bar"; // 使用时 foreach (DataRow dr in MyDataTable.Rows) { MyDataGridView.Rows.Add(dr[ColumnFoo].ToString(), dr[ColumnBar].ToString()); }
IDE会自动提示常量名称,拼写错误会直接在编译阶段报错,不会留到运行时。
3. 生成强类型DataTable(最推荐)
这是最彻底的解决方案:用Visual Studio的数据集设计器,或者手动编写强类型的DataTable子类,让DataRow直接暴露对应列的强类型属性。示例如下:
// 强类型DataRow示例(可通过工具自动生成) public class MyCustomRow : DataRow { internal MyCustomRow(DataRowBuilder builder) : base(builder) { } public string Foo { get => this["foo"].ToString(); set => this["foo"] = value; } public string Bar { get => this["bar"].ToString(); set => this["bar"] = value; } } // 使用时直接访问属性,编译时完全验证 foreach (MyCustomRow dr in MyDataTable.Rows) { MyDataGridView.Rows.Add(dr.Foo, dr.Bar); }
这种方式不仅解决了列名拼写问题,还能自动处理类型转换(不用每次写ToString()),后续修改列时,强类型属性的变更会直接触发编译错误,能第一时间发现问题。另外,强类型DataTable还支持DataGridView的直接绑定——直接设置MyDataGridView.DataSource = MyDataTable,列的增减会自动同步到DataGridView,彻底省去手动维护Rows.Add参数的麻烦。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

