C# winform DataGridView 怎么通过代码动态地控制光标到指定行?(请确认方法可行再回答)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# winform DataGridView 怎么通过代码动态地控制光标到指定行?(请确认方法可行再回答)相关的知识,希望对你有一定的参考价值。

我做的是一个数据显示表,不需要增减行,通过代码动态实现了仅有前面三行的单元格内容可以被修改。但问题是我需要通过后台代码对用户的输入数据进行自动处理和判断后,根据处理和判断结果动态的指定光标到某一个单元格。我弄了四天了,发现通过代码要指定光标到某一列可以,但要通过代码怎么都不能实现光标上下行移动。只能通过鼠标和键盘才能移动光标到上一行或下一行。总之就是代码无法改变光标所在行位置。从大年初一开始,到大年初五。网上很多方法,全都试了,没用。现在还没搞定。晕了……请高手帮忙!回答前请自己验证了OK再来。灌水的、打酱油的请别来了。我已经晕得不行了!
一楼hailht老兄,都说了不要打酱油了!……再补充下,我的DataGridView是在窗体Load事件中绑定一个DataTable,得到一个DataGridView数据表。然后通过代码动态控制实现只能编辑前三行的单元格,再根据输入的数据来动态的控制光标到任意行的任意单元格,而不是上下移动一行。因为我根本不知道实际到底会移动多少行多少个单元格,这是程序自动计算控制的,无法事先预知。且如果一行一行的移,要是我的表格有几万条、甚至几十万条时,那移动的时候岂不是闪得很“好看”?我要的是输入完一个单元格的数据后,对输入数据进行处理,然后根据处理结果,直接定位到指定的行的指定单元格,但指定的行和指定的单元格是不可预见的,只能通过后台处理后得出数据,然后再根据计算数据得出该移动到哪一行哪一单元格。而不是用户点击来实现。
二楼{yyhian的方法需要用户点击botton按钮才能实现。且你这也和一楼说的一样,只是一行一行移动,不是我想要的。虽然可以用你的思路变通一下不需要点击就可以实现,但实现起来太麻烦。而且行、列数很多时,就的不停的触发botton的点击事件才能实现。继续期待高手解决……

/*你真让我无语,虽然我加了两个BUTTON,但改动光标的还是靠BUTTON事件里面的代码啊。你可以把那段代码拿出来放到你要使用的任何地方用的-。-!。还有啊。光标的位置我是那样设置的,就是一次上下移动一行,但是只要把那个dataGridView1.currentCell[colIndex,rolIndex]中的两个Index设置你为要改变那个CELL的Index就可以了。可以在任何地方,不一定非得按我写的用。我只是告诉你,此方法可行。而且BUTTON事件里面的代码行总共也就5,6行吧,再怎么修改也没多少工作量的你只先计算出你的CELL的Index就行了,实现起来哪有多难啊,我可以很负责任地告诉你,这真的很简单。非得吃现成的!*/

//你试一下下面的代码是不是你要的那种
public partial class Form1 : Form


int colIndex = -1;
int rowIndex = -1;
DataGridView dataGridView1;
Button button1,button2;
bool isButtonClick = false;
public Form1()

InitializeComponent();

dataGridView1 = new DataGridView();
button1 = new Button();
button2 = new Button();
this.Controls.AddRange(new Control[] dataGridView1, button1, button2 );

this.MaximizeBox = false;
this.FormBorderStyle = FormBorderStyle.FixedDialog;

dataGridView1.Left = 30;
dataGridView1.Top = 30;
dataGridView1.Width = this.Width - 70;
dataGridView1.Height = this.Height - 160;
button1.Left = this.Left + this.Width -250;
button1.Top = this.Bottom - button1.Height - 50;
button1.Text = "上一行";
button2.Left = button1.Right + 10;
button2.Top = button1.Top;
button2.Text = "下一行";

button1.Click += new EventHandler(button1_Click);
button2.Click += new EventHandler(button2_Click);
dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged);


void dataGridView1_SelectionChanged(object sender, EventArgs e)

if (colIndex != dataGridView1.CurrentCell.ColumnIndex)

colIndex = dataGridView1.CurrentCell.ColumnIndex;
rowIndex = dataGridView1.CurrentCell.RowIndex;

else if (!isButtonClick)

rowIndex = dataGridView1.CurrentCell.RowIndex;

else

isButtonClick = false;



private void Form1_Load(object sender, EventArgs e)

// Create new DataTable.
DataTable table = new DataTable("table");

// Declare DataColumn and DataRow variables.
DataColumn column;
DataRow row;

// Create new DataColumn, set DataType,
// ColumnName and add to DataTable.
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "id";
table.Columns.Add(column);

// Create second column.
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "item";
table.Columns.Add(column);

// Create new DataRow objects and add to DataTable.
for (int i = 0; i < 10; i++)

row = table.NewRow();
row["id"] = i;
row["item"] = "item " + i;
table.Rows.Add(row);

// Set to DataGrid.DataSource property to the table.
dataGridView1.DataSource = table;
dataGridView1.Focus();
dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
if (dataGridView1.Columns.Count > 0 && dataGridView1.Rows.Count > 0)

dataGridView1.CurrentCell = dataGridView1[0, 0];
colIndex = dataGridView1.CurrentCell.ColumnIndex;
rowIndex = dataGridView1.CurrentCell.RowIndex;



private void button1_Click(object sender, EventArgs e)

isButtonClick = true;
dataGridView1.CancelEdit();

if (rowIndex > 0)

dataGridView1.CurrentCell = dataGridView1[colIndex, --rowIndex];

else

rowIndex = dataGridView1.Rows.Count - 1;
dataGridView1.CurrentCell = dataGridView1[colIndex, rowIndex];

dataGridView1.BeginEdit(false);


private void button2_Click(object sender, EventArgs e)

isButtonClick = true;
dataGridView1.CancelEdit();

if (rowIndex < dataGridView1.Rows.Count - 1)

dataGridView1.CurrentCell = dataGridView1[colIndex, ++rowIndex];

else

rowIndex = 0;
dataGridView1.CurrentCell = dataGridView1[colIndex, rowIndex];


dataGridView1.BeginEdit(false);

参考技术A 如果是绑定的datagridview话,会产生一个datasource(名称会根据实际情况而变)这是类有很多方法,里面有movenext等,就是向上向下,第一条,最后一条,这样移动记录

C# winform DataGridView刷新慢

写了一个程序使用开发工具winform,在使用DataGridView控件,在我的机子上面运行一点问题都没得,不管数据有多少行,都不行影响性能,在同事的机子上运行(Amd Athlon 5400+,GF9500的独显) ,如果数据的行数太多,已经到了满幕后,就会出现一个滚动条,拖动滚动条时感觉数据刷新很慢,并且数据一直在从上往下闪屏,这时候如果再来操作这些数据,基本上是机子就痴呆了,程序运行起来慢得要死,打开任务管理器,CPU使用率直接50%以上,我本人的机子比同事的机子配置要差得多,都不会出现这种情况,但是不知道为什么样会出现这样子的一种情况。
问题描述完了,请高人指点。
全都是些瓜麻批。。

你们的硬件环境不同,操作系统环境可能也有所不同。比如他在运行你的程序的同时是否有很多后台程序在运行?如果操作系统中同时运行的线程过多,就会造成类似情况。

另外,你的CPU是否是Intel的,有时候某些AMD的CPU的计算能力有点问题。

一般编写的WinForm程序与显卡关系不大,他们都是采用CPU来计算界面,所以消耗CPU比较大,如果CPU的计算能力不同,就会造成刷屏的情况。WinForm与WPF不同,WPF是借用显卡的处理器,将界面重画工作都交给了显卡,解放了CPU的处理。
参考技术A 你可以删掉DataGridView重做一次试试:
1.删除掉现有的DataGridView
2.拖一个新的DataGridView,不改变任何属性,不手动创建列.
3.直接把数据绑定到DataGridView,看速度是否还是很慢.
若这样还很慢,就是你的电脑问题

如果上面的方法还不能解决,
那你就用分页的方式来显示吧...
参考技术B 分屏撒,你整这么多干什么 参考技术C 这个,我知道你是瓷锤!

以上是关于C# winform DataGridView 怎么通过代码动态地控制光标到指定行?(请确认方法可行再回答)的主要内容,如果未能解决你的问题,请参考以下文章

C# winform dataGridView批量数据修改

c# winform datagridview界面上的行删了,但datagridview数据源没有同步如何解决

c# winform datagridview怎么能达到如图的效果

C# winform 如何用datagridview增、删、改数据

winform c# Datagridview 选中行 急!!!

通过 TextBox(C#、WinForms)过滤空 DataGridView