近期学习C#开发一个管理系统,后台采用PostgreSql数据库,第一次使用数组作为字段类型,因为C#类型基础不牢,频繁报错,取不到想要的值,网上资料也较少,搜到的问题,基本没有可以参考的答案;
在用dataGridView控件展示有以“数组”为字段类型的列时,要指定DataPropertyName,显示的结果不能直接引用 ,要进行处理后才能显示;
一、PG数据库脚本
DROP TABLE IF EXISTS "public"."test1";
CREATE TABLE "public"."test1" (
"id" int4,
"col1" int4[],
"col2" int4[],
"col3" text[][] COLLATE "pg_catalog"."default"
)
;
INSERT INTO "public"."test1" VALUES (1, '{1,2}', NULL, NULL);
INSERT INTO "public"."test1" VALUES (2, '{1,2}', NULL, NULL);
INSERT INTO "public"."test1" VALUES (3, '{1,2}', NULL, NULL);
二、datagridiew中编辑列及绑定;
如果不在dataGridView1中绑定每列的数据源,则COL1,COL2,COL3数组列不会自动显示;
以下是没有指定DataPropertyName的运行效果,只有id列:
三、运行显示结果
程序直接运行,dataGridView列中的内容为Int32[] Array .
四、几种不同的取值结果:
以下是以在DataTAble中的结果来演示说明 ,如果直接取值会是:System.Int32[];
取他的类型显示是Object , 但是打断点测试时,可以看到他的内容是表格;
在窗体的load事件中加入以下代码:(只取了第一行,COL1列的数据做演示)
DataTable dt = DBHelperPg.ExecuteDataTable("select * from test1"); --DBHelperPg.ExecuteDataTable是我封装的SQL类和方法
dataGridView1.DataSource = dt;
textBox1.Text = Convert.ToString(dt.Rows[0][1]); textBox2.Text = Convert.GetTypeCode(dt.Rows[0][1]).ToString(); var abdc = dt.Rows[0][1]; Array a = new Array[3]; a = (Array) abdc; textBox3.Text = ((Array)dt.Rows[0][1]).ToString(); textBox4.Text = CommFunc.IntArrayToString(a);
var ddc = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[1].Value; textBox1.Text = Convert.ToString(ddc); textBox2.Text = Convert.GetTypeCode(ddc).ToString(); Array a = new Array[3]; a = (Array) ddc; textBox3.Text = ((Array)a).ToString(); textBox4.Text = CommFunc.IntArrayToString(a);
以DataGridView控件取值 为例;
附:整形数组转字符串函数(通过object类型强转过来的适应,用int[]定义的应该要简单 些)
/// <summary> /// 整形数组转字符串 /// </summary> /// <param name="intParam">整形数组</param> /// <returns>字符串</returns> public static string IntArrayToString(Array intParam) { string str = ""; try { foreach (int i in intParam) { str += i.ToString() + ","; } } catch { } return str; }