DataGridView的数据绑定问题

jbo126 2010-06-01 07:29:05
在将DataGridView绑定到对象时,DataGridView会为对象和公共属性生成Column,有没有办法在定义对象时控制DataGridView里面各列的顺序?现在我只知道在对象的其个公共属性上应用DisplayNameAttribute和BrowsableAttribute可以控制其在DataGridView中相应“列”的HeadText和可见性,不知有没有其他的###Attribute可以控制这些列的顺序?

如果这个对象中有一个枚举类型的公共属性,我想让DataGridView中的相应“列”使用DataGridViewComboBoxColumn类型的列,在已绑定的情况下这个能不能实现,怎么实现?


我有一个自定义的集合:CollectionBase<T>
还有一个自定义类型Document<T>:CollectionBase<T> where T:IRecord{},两个实现IRecord接口的类型GearRecord和TorquerRecord.
请问如果在Document<IRecord>与Document<GearRecord>或Document<TorquerRecord>之间实现转换,因为我发现他们无法通过Cast扩展方法或 as 实现转换。



我现在的试验室主要有两种产品需要试验,它们的记录文件中的项不完全相同,如以一开始我定义的一个基类Record,包括试件编号,起止时间,试验员等通用的,然后派生了GearRecord和TorquerRecord两个类,然后分另添加了其他的记录项,它们都定义为公共属性。最开始的想法是尽量屏蔽二者的差别,尽量使用一个界面就能操作这两种记录文件,但在将Document<Record>的一个实例作为数据源绑定到DataGridView后,虽然添加的是GearRecord或TorquerRecord对象的实例,但是发现DataGridView里面只有Record基类中定义的那些通用项,其他的没有!后来将Record换成了IRecord接口还是不行,能不能告诉我到底应该怎么改?是不是压根就是思路有问题?
...全文
582 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jbo126 2010-06-03
  • 打赏
  • 举报
回复
看来我只能妥协了!!!
关于列的顺序问题我已经决定使用自定义属性了(我定义了个BindingColumnAttribute)。为解决其他的问题(比如列的类型),我取消了采用绑定的方式,也是根据上面定义的BindingColumnAttribute,在手动添加的时候直接生成需要的列类型,,虽然数据同步很困难,但眼下是个比较现实的办法,好了,谢谢各位的热情!
悔说话的哑巴 2010-06-02
  • 打赏
  • 举报
回复
DataGridView不是有个自定义?还是我没有明白你的意思?
yudengchang 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liuyu520hong 的回复:]
使用设计器更改列顺序

从智能标记中选择“编辑列”。

从“选定的列”列表中选择一列。

单击“选定的列”列表右边的向上或向下箭头,直到选定的列位于所希望的位置。
或者
customersDataGridView.Columns["CustomerID"].Visible = false;
customersDataGridView.Columns["ContactName……
[/Quote]

一直用这个,这个没有问题的,关注新的方法.
yong_shao 2010-06-02
  • 打赏
  • 举报
回复
顶一下

我最近都有做这个 我的方法跟楼上的liuyu520hong相似哦...
lanfengsese 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 liuyu520hong 的回复:]
使用设计器更改列顺序

从智能标记中选择“编辑列”。

从“选定的列”列表中选择一列。

单击“选定的列”列表右边的向上或向下箭头,直到选定的列位于所希望的位置。
或者
customersDataGridView.Columns["CustomerID"].Visible = false;
customersDataGridView.Columns["ContactName……
[/Quote]
up一下
jbo126 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 computerfox 的回复:]
我不太明白,你绑定到自定义对象是怎么绑定的?
BindingComplete事件中设置的,可那个时候列已经自动添加完了
这是肯定到了,都已经Complete了!

你为什么不直接自定义列,来实现绑定?
[/Quote]
是这样,一开始通过BindingSource,后来干脆自已定义了一个集合就是那个继承自CollectionBase<T>(当然这个也是我自己定义的)的Document<T>,然后将它的实例直接赋值给DataGridView的DataSource属性,之所以这样做是因为我想Document<T>本身是个试验记录的集合,还可以在它里面定义试验参数,试验标准,参与试验的试验员等属性的。
这样的好处就是:比如目前界面上显示的记录,在不更改DataSource的情况下我只要通过简单的更改DataGridView的DataMember就可以显示试验参数!更重要的是由于每个Document<T>对应于磁盘上的一个文件,所以我觉得这样更为“紧凑”,也方便将它序列化到文件!
第二点,之所以Document<T>做成个泛型,是因为有两种不完全相同的记录,一个是变整箱的,一个是变矩器的,它们有试件编号,起止时间,试验档位,试验员等共同的记录项,也不各自不同的其他记录项。正因如此我为上面那个“T”定义的个GearRecord和TorquerRecord两个类。绑定是在运行时进行的,即只有当我打开一个子窗体,才从磁盘文件上读一个文件并生成一个Document<GearRecord>或Document<TorquerRecord>绑定到子窗体的DataGridView,所在上面的朋友说在设计时对我这个情况不合适!我想用同一个界面(DataGridView)来处理这两种记录类型,想问一下可行不可行?
汗~~~~,这事也是我吃饱了撑的,我也想好了,实在不行我就做两个子窗体分别处理它们算了!

liuyu520hong 2010-06-02
  • 打赏
  • 举报
回复
使用设计器更改列顺序

从智能标记中选择“编辑列”。

从“选定的列”列表中选择一列。

单击“选定的列”列表右边的向上或向下箭头,直到选定的列位于所希望的位置。
或者
customersDataGridView.Columns["CustomerID"].Visible = false;
customersDataGridView.Columns["ContactName"].DisplayIndex = 0;
customersDataGridView.Columns["ContactTitle"].DisplayIndex = 1;
customersDataGridView.Columns["City"].DisplayIndex = 2;
customersDataGridView.Columns["Country"].DisplayIndex = 3;
customersDataGridView.Columns["CompanyName"].DisplayIndex = 4;
同时要把this.dataGridView1.AutoGenerateColumns = false;这样就可以控制了.
beijingbeerman 2010-06-02
  • 打赏
  • 举报
回复
dgvPSTFiles.Rows.Add(New Object() {selectAll.Checked, pst, pstOwner, userNoneid, Me.AssignToName, Config.NoNote, size})
捷哥1999 2010-06-01
  • 打赏
  • 举报
回复
我不太明白,你绑定到自定义对象是怎么绑定的?
BindingComplete事件中设置的,可那个时候列已经自动添加完了
这是肯定到了,都已经Complete了!

你为什么不直接自定义列,来实现绑定?
jbo126 2010-06-01
  • 打赏
  • 举报
回复
to 6L:
如果每次都要在输入数据的时候更改它们的顺序是不是显得有点麻烦,现在就这个问题我想在问的细一点:如果数据绑定后,DataGridView控件在自动添加列完成后是不是有什么想应的事件没有?如果有的话我想自定义一个ColumnIndexAttribute之类的东西,然后在事件中利用反射得出相应的值,再设置相应的列,这相的话我就可以只在自已定义的类中在相应的属性上用一个[ColumnIndexAttribute(int)]属性就可以更改它们在DataGridView里的顺序,那不是要比每次用的时候再调整强点?
jbo126 2010-06-01
  • 打赏
  • 举报
回复
我的DataGridView是在运行是绑定的,不知是Document<GearRecord>还是Document<TorquerRecord>,没法在设计时设置列,原本想在BindingComplete事件中设置的,可那个时候列已经自动添加完了,且列的类型默认为TextBoxColumn或CheckBoxColumn,无法在运行时更改它们的列类型,ColumnType好象是设计时属性!
wuyq11 2010-06-01
  • 打赏
  • 举报
回复
DataGridView 自定义列
设定 DataGridView 的 AllowUserToOrderColumns 为 True 的时候, 用户可以自由调整列的顺序
DataGridView1_ColumnDisplayIndexChanged
DisplayIndex
army369168520 2010-06-01
  • 打赏
  • 举报
回复
LZ的问题好犀利,好像我第一次碰到,学习!
UP!!!
皇城龙三 2010-06-01
  • 打赏
  • 举报
回复
关于使用DataGridViewComboBoxColumn类型的列

网上有这么说的:可以把DataGridView.AutoGenerateColumns属性,设置为False,然后手动的添加列的类型,可以在窗体的设计时完成这些操作.这时你可以把一个列设置成任一个你喜欢的类型或样式.
比如你可以在窗体的设计时通过DataGridView的一个列的ColumnType来改变列的类
皇城龙三 2010-06-01
  • 打赏
  • 举报
回复
使用设计器更改列顺序

从智能标记中选择“编辑列”。

从“选定的列”列表中选择一列。

单击“选定的列”列表右边的向上或向下箭头,直到选定的列位于所希望的位置。

皇城龙三 2010-06-01
  • 打赏
  • 举报
回复
自定义DataGridView列顺序

private void AdjustColumnOrder()
{
customersDataGridView.Columns["CustomerID"].Visible = false;
customersDataGridView.Columns["ContactName"].DisplayIndex = 0;
customersDataGridView.Columns["ContactTitle"].DisplayIndex = 1;
customersDataGridView.Columns["City"].DisplayIndex = 2;
customersDataGridView.Columns["Country"].DisplayIndex = 3;
customersDataGridView.Columns["CompanyName"].DisplayIndex = 4;
}
xshf12345 2010-06-01
  • 打赏
  • 举报
回复
有没有办法在定义对象时控制DataGridView里面各列的顺序?===>>自己写column

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧