DataGridView 控制行问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataGridView 控制行问题相关的知识,希望对你有一定的参考价值。
1、DataGridView中,需要冻结某一行如何实现?
2、如何设置某一行显示的位置?
解决了还可以加分,大家帮帮我啊
2。没明白啥意思追问
要的就是Excel中有个冻结的那种效果,选择某一行冻结,我滑动滚动条的时候,这一行不会随着滚动
参考技术Aprivate void Form1_Load(object sender, EventArgs e)
dataGridView1.AutoGenerateColumns = false; //设置自动创建列为false
this.dataGridView1.Columns.Add("Id", "编号"); //自定义列
this.dataGridView1.Columns.Add("Name", "姓名"); //自定义列
this.dataGridView1.Columns.Add("Period", "学分"); //自定义列
using (SqlConnection conn = new SqlConnection(@"你的数据库连接字符串"))
var da = new SqlDataAdapter("select * from Courses", conn);
DataSet ds = new DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];
dataGridView1.Columns["Id"].DataPropertyName = "Id"; //给列绑定数据
dataGridView1.Columns["Name"].DataPropertyName = "Name"; //给列绑定数据
dataGridView1.Columns["Period"].DataPropertyName = "Period"; //给列绑定数据
追问
你这是在干什么?
追答你不是要知道 如何设置某一行显示的位置吗?
this.dataGridView1.Columns.Add("Id", "编号"); //自定义列
this.dataGridView1.Columns.Add("Name", "姓名"); //自定义列
this.dataGridView1.Columns.Add("Period", "学分"); //自定义列
这个定义的顺序就是设置某一行显示的位置呀
我要的不是这个,你这个这个只是确定某一列显示什么字段信息而已。这个我初学的时候就知道了。
追答你要的是行呀
参考技术B 如果要实现数据的排版啊,位置啊,强烈建议使用Repeater。灵活性最强。追问请看好 这个是DataGridView而不是GridView,
DataGridView 问题,不可见行仍然可见,尽管有 DataSource,但 DataGridView 为空
【中文标题】DataGridView 问题,不可见行仍然可见,尽管有 DataSource,但 DataGridView 为空【英文标题】:DataGridView problems, nonvisible rows are still visible and the DataGridView is empty despite having a DataSource 【发布时间】:2010-11-15 11:49:20 【问题描述】:DataGridView
中的行有几个问题。
背景信息: DataGridView
(DataGridViewCalib
) 在TabControl
的一个TabPage
中,DataGridView 的某些列自动为DataGridViewCheckBoxColumn
,因为DataSource
有一些列是Boolean
。这是使用 Visual Studio 2008 用 VB.Net 编写的 Windows 窗体。用户加载输入数据文件。
问题:
1) 在第一次到达TabPage
时,会调用ShowDataGridViewCalib
(代码如下)。然后所有行都显示在DataGridView
中,尽管代码说某些行不应该是可见的。代码中的断点表明代码确实到达了Rows.Visible = False
事件。
尽管在调试器中显示了所有行,但 Watch 显示:
DataGridViewCalib.DisplayedColumnCount(True)=0
DataGridViewCalib.DisplayedColumnCount(False=0)
DataGridViewCalib.DisplayedRowCount(True)=0
DataGridViewCalib.DisplayedRowCount(False)=0
Columns.Visible=False
按预期工作。
当第二次运行子例程ShowDataGridViewCalib
时,通过从checkbox
CbUniform
强制执行它,行数的减少可以正常工作,DataGridViewCalib.Displayed...Count
是正确的。
是什么导致整个DataTable
第一次显示?
2) 用户可以加载另一个输入数据文件。当加载第二个输入文件并运行ShowDataGridViewCalib
时,会发生另一件奇怪的事情。 DataGridViewCalib.DataSource = System.Data.DataTable
和这个DataTable
具有与dtCatchCalib
相同的属性,
但是
DataGridViewCalib.Columns.Count = 0
DataGridViewCalib.Rows.Count = 0
DataGridView
中没有显示任何内容。
在加载第二个输入文件之前,大部分数据被清除,包括DataGridViewCalib.Columns.Clear()
和dtCatchCalib.Clear()
。特别是对于第二个问题,我假设错误可能在ShowDataGridViewCalib
之外的某个地方,但我很乐意提供有关导致DataGridView
有DataSource
但仍然没有行和列的提示。
代码:
Private Sub ShowDataGridViewCalib()
'[...]
Dim kolwidth As Integer = 77
DataGridViewCalib.DataSource = dtCatchCalib
DataGridViewCalib.Refresh()
Dim kol As DataGridViewColumn
For Each kol In DataGridViewCalib.Columns
kol.SortMode = DataGridViewColumnSortMode.NotSortable
If CbUniform.Checked = False Then
kol.Visible = True
kol.Width = kolwidth
If kol.Name = "CatchmentID" Then
kol.ReadOnly = True
ElseIf kol.Name = "parc0" Then
kol.HeaderText = "c0"
ElseIf kol.Name = "statr" Then
kol.Visible = False
kol.ReadOnly = True
kol.HeaderText = "r"
End If
Else
If kol.Name = "IncludeObs" Then
kol.Width = kolwidth
ElseIf kol.Name = "CatchmentID" Then
kol.ReadOnly = True
kol.Width = kolwidth
Else
kol.Visible = False
End If
End If
Next
'Dim rad As DataGridViewRow
'Dim dum As Integer
'dum = 0
'For Each rad In DataGridViewCalib.Rows
' dum += 1 ' # rows in dtCatchCalib is = # subcatchments
' DataGridViewCalib.CurrentCell = Nothing ' Unselect the current cell, needed to be able to set the row invisible
' rad.Visible = False ' TEST
' If ObsLst(dum) = True Then ' ObsLst have its first value at index 1
' rad.Visible = True
' Else
' DataGridViewCalib.CurrentCell = Nothing ' Unselect the current cell, needed to be able to set the row invisible
' rad.Visible = False
' End If
'Next
For i = 0 To dtCatchCalib.Rows.Count - 1
DataGridViewCalib.CurrentCell = Nothing
DataGridViewCalib.Rows(i).Visible = False
If ObsLst(i+1) = True Then ' ObsLst have its first value at index 1
DataGridViewCalib.Rows(i).Visible = True
Else
DataGridViewCalib.CurrentCell = Nothing
DataGridViewCalib.Rows(i).Visible = False
End If
Next
'[...]
End Sub
有两种方法可以处理代码中的行。第一次尝试(在此处注释掉)可能是“最好的”。
这是我第一次在编程论坛上发布问题。如果我表达不够清楚,请再问我一次。
【问题讨论】:
我刚刚在social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/… 在这里发布了同样的问题@ 当我在一个论坛上得到答案时,我会在另一个论坛上提供指向该问题的链接。 【参考方案1】:我仍然不知道程序为什么会像描述的那样运行,但我现在有一个解决方法。我正在显示的DataTable
无论如何都是一个临时的DataTable
,它结合了我实际上想要显示的两个不同DataTables
的列。因此,我已经从这个临时的DataTable
中删除了这些行,而不是通过DataGridView
来完成。通过CellValueChanged
事件,我将临时DataTable
中的更改传递给原始DataTables
。
【讨论】:
【参考方案2】:我通过设置解决的第二个问题
DataGridViewCalib.DataSource=Nothing
当我在加载新文件之前清除表单和数据时。
我在这里也得到了额外的回复http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/27e46f65-f27b-4f24-805f-209f02b29574
来自Aland Li,说
根据您的描述,这两个问题有一个共同特点:我们确实设置了 Visible 属性,但它没有反应。原因主要是我们在DataGridView中设置了行的Visible属性后再次绑定了数据源。例如,我们通过将所有行的 Visible 属性设置为 false 来设置所有行不可见,并期望它们被隐藏。但是在我们设置 Visible 属性并重新创建行之后,可能会再次绑定数据源。旧行已处理,因此设置不会做出反应。新行被初始化并且它们的 Visible 属性为真。所以这些行仍然可见。 您可以通过跟踪 DataBindingComplete 事件来跟踪数据源绑定。您可以向该事件添加处理程序并显示一些消息。然后你会知道数据源是否再次绑定。
尼罗河
【讨论】:
如果您不是 RE:***.com/a/14501458/427684,可能值得使用BindingSource
以上是关于DataGridView 控制行问题的主要内容,如果未能解决你的问题,请参考以下文章
将 DataTable 绑定到已定义列的 Datagridview
如何允许用户在 c# 中的 datagridview 组合框中手动输入
怎么让datagridview不自动修改绑定的datatable
在 DataGridView 中,根据输入的值更改选定的单元格
DataGridView 与组合框列显示 System.Data.DataRowView 而不是 DisplayMember