DataGridView丢失了在设计时指定的初始状态

时间:2010-11-17 17:11:15

标签: vb.net

当我尝试更改DataGridView的数据源时,我正在丢失我在设计时指定的列及其类型(复选框,组合框)的顺序。

这就像更改数据源再次生成datagridview,为什么?如何在不丢失这些信息的情况下更改数据源?

如果你知道请给我帮助

提前致谢

在表单加载时,我会执行类似

的操作
Private Sub frmGrid_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Path as string
Path="C:\......Myfile.xml"

Dim oData  as dataset
oData = New DataSet
oData.ReadXml(Path)
oData.AcceptChanges() 

DataGridView1.DataSource = oData
DataGridView1.DataMember =  oData.Tables(0).TableName 
end sub

直到现在一切都很好,设计模式得以保留。

然后我在我的界面中有一个按钮将我的网格内容保存到excel文件(它是一个xml,格式化为excel)

然后我想在按钮操作中导入它,所以我执行以下操作

Private Sub Button13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click           
Dim MyDs As DataSet
MyDs = New DataSet
Dim InputFileStream As New System.IO.FileStream(Path, System.IO.FileMode.Open)
MyDs = ImportExcelXML(InputFileStream, True, True)
MyDs.ReadXml(Path)
MyDs.AcceptChanges()
DataGridView1.DataSource = MyDs
DataGridView1.DataMember = MyDs.Tables(0).TableName    
end sub

3 个答案:

答案 0 :(得分:0)

你可以将GenerateColums属性设置为“True”

这意味着GridView将生成数据列的列(名称和数量)。

如果数据源(在您的案例数据表中)不同,它将出现不同的网格。

如果数据源不同,您可以设计gridView的布局,但之后您必须根据需要手动将数据绑定到列。您可以这样做到

RowDataBound事件。

答案 1 :(得分:0)

您尝试分配给DataGridView1.DataSource的数据表的结构与您在设计时定义DataGridView的方式不同。在将新DataTable重新分配给DataSource之前,在代码中设置一个断点,并查看结构中的不同之处。您可能有更多或更少的DataColumns,或者列可能有不同的顺序。他们甚至可能命名不同。如果在设计时将DataGridViewColumn的DataProperty设置为特定名称,那么名称必须精确。

你只需要在那个断点检查它,看看有什么不同。

答案 2 :(得分:0)

我找到了解决方案,您的提示帮助我找到正确的方向找到解决方案!

我在做的是表单加载

MaGrille.DataSource = oData
MaGrille.DataMember = oData.Tables(0).TableName

然后在按钮中单击我执行:

MaGrille.DataSource = MyDs
MaGrille.DataMember = MyDs.Tables(0).TableName

问题是网格正在重建,我放松了格式,列顺序等。

经过多次测试,我明白它不起作用,因为数据表的名称是不同的!我不明白为什么,但它似乎是错误。 我有以下价值观 oData.Tables(0)=“DECLARATION” MyDs.Tables(0)=“Sheet1”

所以我注意到如果我通过“DECLARATION”而不是“Sheet1”重命名MyDs.Tables(0),并且我点击按钮,这次我没有松散格式,也没有订单......

这激发了我找到 SOLUTION

经过多次尝试,我意识到如果不是在表单上加载

MaGrille.DataSource = oData
MaGrille.DataMember = oData.Tables(0).TableName

并点击按钮:

MaGrille.DataSource = MyDs
MaGrille.DataMember = MyDs.Tables(0).TableName

我做:

表单加载

MaGrille.DataSource = oData.Tables(0)

并点击按钮

MaGrille.DataSource = MyDs.Tables(0)

即使oData.Tables(0).TableName与MyDs.Tables(0)不同,所有工作正常.TableName !!

我找到了解决方案现在,但仍然无法理解为什么如果有人得到解释,请告诉我。

再次感谢