Tag: datagridview

Windows窗体DataGridView是否实现了真正的虚拟模式?

我有一个SQL表,其中包含当前将随时间增长的100万行。 特定用户要求提供可排序网格,该网格显示所有行而不进行分页。 用户希望能够通过使用滚动条快速地从一行跳到另一行以及从上到下跳转。 我熟悉“虚拟模式”网格,它只显示整个数据的可见子集。 它们可以提供出色的UI性能和最小的内存要求(我甚至多年前使用这种技术实现了一个应用程序)。 Windows窗体DataGridView提供了一个看起来应该是答案的虚拟模式。 然而,与我遇到的其他虚拟模式不同,它仍然为每一行分配内存(在ProcessExplorer中确认)。 显然,这会导致整体内存使用量不必要地大大增加,并且在分配这些行时,会有明显的延迟。 滚动性能也会受到100万+行的影响。 真正的虚拟模式不需要为未显示的行分配任何内存。 您只需给它总行数(例如1,000,000),所有网格都会相应地缩放滚动条。 当它首次显示时,网格只询问数据前n个(比如30个)可见行,即时显示。 当用户滚动网格时,提供简单的行偏移和可见行的数量,并且可用于从数据存储中检索数据。 这是我正在使用的DataGridView代码的示例: public void AddVirtualRows(int rowCount) { dataGridList.ColumnCount = 4; dataGridList.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dataGridList.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None; dataGridList.VirtualMode = true; dataGridList.RowCount = rowCount; dataGridList.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridList_CellValueNeeded); } void dataGridList_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e) { e.Value = e.RowIndex; } 我在这里遗漏了什么,或者DataGridView的“虚拟”模式根本不是虚拟的? [更新] 看起来好的旧ListView实现了我正在寻找的那种虚拟模式。 但遗憾的是ListView没有DataGridView的单元格格式化function,所以我无法使用它。 对于其他可能的人,我使用四列ListView(详细模式),VirtualMode = […]

右键单击以选择dataGridView中的行

我需要在显示ContextMenu之前右键单击dataGridView中的一行,因为contextMenu是row-dependendt。 我试过这个: if (e.Button == MouseButtons.Right) { var hti = dataGrid.HitTest(eX, eY); dataGrid.ClearSelection(); dataGrid.Rows[hti.RowIndex].Selected = true; } 要么: private void dataGrid_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button == MouseButtons.Right) { dataGrid.Rows[e.RowIndex].Selected = true; dataGrid.Focus(); } } 这有效,但当我尝试读取dataGrid.Rows [CurrentRow.Index]时,我只看到左键单击选中的行而不是右键单击选中的行。

C#迭代DataGridView并更改行颜色

我有一个由多行和多列组成的datagridview。 我想迭代每一行并检查特定列的内容。 如果该列包含单词“NO”,我想将整行的前景色更改为红色。 到目前为止,这是对某些代码的尝试,但它肯定无法工作,开始怀疑我是否需要迭代每个单元格? 码: foreach (DataGridViewRow dgvr in dataGridView1.Rows) { if (dgvr.Cells[“FollowedUp”].Value.ToString() == (“No”)) { dgvr.DefaultCellStyle.ForeColor = Color.Red; } }

BindingList ListChanged事件

我有一个类的BindingList 设置为BindingSource的DataSource属性,该属性又设置为DataGridView的DataSource属性。 1.我的理解是,对列表的任何添加都将触发ListChanged事件,该事件将通过BindingSource传播,然后传播到DataGridView,DataGridView将更新自身以显示更改。 这将发生,因为事件已自动连接。 (是?) 当所有工作都在UI线程上完成时,这一切都很好,但是当从非UI线程创建和更改列表时,最终在更新网格时会发生跨线程exception。 我能理解为什么会这样,但是没有办法解决这个问题…… 2.我很难理解,我应该在哪里最好拦截ListChanged事件来尝试将内容整理到UI线程中? 我猜我需要一个UI线程的引用以某种方式帮助做到这一点? 我已经阅读了很多这方面的post/文章,但我很难挣扎,因为我不完全理解这里的工作机制。 一旦他们在列表中,我将永远不会更改任何项目,只添加它们,并最初清除列表。 (我使用的是.NET 2.0)

千位分隔符在数据网格视图中无法正常工作

请让我清楚解释一下,如果有误解请告诉我, 首先,假设我有一个包含三列的网格: ItemName Count Fee 当我点击ItemName和go to fee列时,我的代码工作正常,在这种情况下,当我输入12345时,它实际上在我打字时变为12,345。 但是当我去计数列然后费用列时它不起作用,例如当我输入12345时它不会放逗号。 我的代码: Public Override string Text { get { return base.Text; } set { base.Text=GetFormattedText(value); } } protected override void OnTextChanged(System.EventArgs e) { base.OnTextChanged(e); Text= GetFormattedText(Text); } Protected virtual string GetFormattedText(string Text) { string strText= text.Replace(“,”,””); decimal decValue=System.Convert.ToDecimal(strText); strText= decValue.Tostring(“#,##0”); Return strText; } 更多解释我确信我的属性的GET有问题,因为在这种情况下,我的意思是当我首先计算列然后费用列它只是调用get而不是OnTextChanged , 我知道我的问题似乎很愚蠢,因为我的知识很少,但如果你能分享一些想法,我真的很感激

如何覆盖C#datagridview的默认工具提示行为,以增加特定单元格的工具提示延迟

我有一个Windows窗体应用程序,在C#中绑定了datagridview。 我正在寻找一种方法来增加特定列的单元格的工具提示持续时间。 通过设置cell.TooltipText属性,在CellMouseEnter处理程序中设置工具提示。 从我在互联网上做的研究来看,似乎我应该有一个外部工具提示对象来增加延迟。 但为此,看起来,ShowCellToolTips应该设置为false。 我需要将ShowCellToolTips设置为true,因为正在为其他各种函数中的其他列单元格设置cell.ToolTipText。 有没有办法覆盖特定列的单元格的默认cell.ToolTipText属性,并具有外部Tooltip对象显示工具提示? 目标是将ShowCellToolTips设置为true并增加工具提示的延迟或为用户提供关闭工具提示的控件。 有没有办法做到这一点? 任何帮助将非常感谢。 谢谢。

DataGridView在更新和重新加载后保留选定的索引和滚动位置

我有一些问题,现在不要如何保持DataGridView的滚动位置。 我有超过1000行,滚动回编辑行是痛苦的。 如何在刷新数据后保留滚动位置并滚动到已编辑的行?

在C#中读取xml文件的节点

如何将以下xml文件读入List: 部分XML文件(data.log) Message 10/13/2016 11:15:00 AM N/A Sending ‘required orders’ email. Message 10/13/2016 11:15:10 AM N/A Branches Not Placed Orders – 1018 Message 10/13/2016 11:15:10 AM N/A Branches Not Placed Orders – 1019 … 这是数据访问层(DAL): public List Get() { try { XmlTextReader xmlTextReader = new XmlTextReader(@”C:\data.log”); List recordSet = new List(); xmlTextReader.Read(); while (xmlTextReader.Read()) { […]

错误“当控件是数据绑定时,无法以编程方式将行添加到datagridview的行集合中”

我有一个DataGridView和几个TextBox和combobox控件。 当我在文本框控件中输入数据并单击添加按钮时,将值添加到DataGridView视图以供用户查看,单击保存按钮时,值将保存在DB中。 问题是我有一个TextBox (Invoice_No),在这个TextBox离开事件我已经编写了代码来从DB获取数据到数据网格视图。 现在,我无法通过在TextBox控件中输入值来向此网格添加其他行。 它给出了以下错误 当控件是数据绑定时,无法以编程方式将行添加到datagridview的行集合中 private void textBox1_Leave(object sender, EventArgs e) { MySqlConnection connection = new MySqlConnection(myconnectionstring); string getinvdtlcnt = “SELECT COUNT(*) FROM invoice_detail WHERE invoice_no = ‘” + textBox1.Text + “‘”; MySqlCommand cmd = new MySqlCommand(getinvdtlcnt, connection); connection.Open(); var ObjResult = cmd.ExecuteScalar(); int Result = Convert.ToInt32(ObjResult); connection.Close(); if (Result > 0) { […]

为DataGridView设置ToolTip会自动创建列

我想以编程方式将工具提示设置为在DataGridView自动生成的列。 我试图使用AutoGeneratingColumn事件( http://msdn.microsoft.com/en-us/library/cc903950%28VS.95%29.aspx ),但实际上只能访问DataGridColumn ,而不能访问DataGridColumn和前者没有ToolTipText属性。 或者,如果我可以将工具提示绑定到一个也很棒的源。 目标是能够在我为基础DataTable设置列的相同位置操作/设置工具提示。