当用户在DataGridView
的最后一栏按Enter键时,如何跳转到下一行?
此代码也给我一个我需要解决的错误:
索引超出范围必须是非负且小于的大小 集合。
private void DataGridView1_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
int iColumn = DataGridView1.CurrentCell.ColumnIndex;
int iRow = DataGridView1.CurrentCell.RowIndex;
if (iColumn >= DataGridView1.Columns.Count - 2)
DataGridView1.CurrentCell = DataGridView1[0, iRow + 1];
else
DataGridView1.CurrentCell = DataGridView1[iColumn + 1, iRow];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString())
}
}
答案 0 :(得分:0)
您可以使用# THIS DOES NOT WORK
library(mlr)
# Here I would import results from my experiments instead of using random data
# e.g. scores for 5 classifiers and 30 data sets, each
results = data.frame(replicate(5, runif(30, 0, 1)))
# This is the functionality I'm looking for
bmr = benchmarkResultFromDataFrame(results)
cd = generateCritDifferencesData(bmr)
plotCritDifferences(cd)
处理此问题,但是您会错过用户在编辑单元格时点击 Enter 的情况。要捕获所有案例,请从DataGridView.KeyDown
派生您自己的类并覆盖DataGridView
。使用上面注释中建议的逻辑,当检测到最后一行的 Enter 时,添加另一行。不要担心手动更改ProcessCmdKey
。让基类自己处理它。
CurrentCell
您只需注意 添加新行的方式,具体取决于您的public class MyDataGridView : DataGridView
{
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool enterKeyDetected = keyData == Keys.Enter;
bool isLastRow = this.CurrentCell.RowIndex == this.RowCount - 1;
if (enterKeyDetected && isLastRow)
{
Console.WriteLine("Enter detected on {0},{1}", this.CurrentCell.RowIndex, this.CurrentCell.ColumnIndex);
// Add the new row.
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
:
无
DataSource
A this.Rows.Add();
DataTable
A DataTable dt = (DataTable)this.DataSource;
dt.Rows.Add();
(请参阅List vs BindingList)
BindingList<T>
等
最后,只需将BindingList<T> bl= (BindingList<T>)this.DataSource;
bl.Add(new T());
的实例替换为此自定义实例。
所有这一切,如果您没有DataGridView
,只需设置DataSource
即可,因为编辑DataGridView.AllowUserToAddRows = true
会触发另一个添加。