【问题标题】:How to set focus to a newly added row or at the end of a row in datagridview?如何将焦点设置到新添加的行或datagridview中的行末尾?
【发布时间】:2013-10-31 13:01:02
【问题描述】:

我有一个 datagridview 和一个添加按钮。每次我将数据添加到 datagridview 时,我希望它将焦点设置到新添加的行或行的末尾。也许是因为我的 datagridview 总是在它的末尾添加/插入数据。

这是我现在的代码:(我在事件 SelectionChanged 中有一些错误)。

Boolean flag_cell_edited;
int currentRow;
int currentColumn;

private void ListView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    flag_cell_edited = true;
    currentColumn = e.ColumnIndex;
    currentRow = e.RowIndex;
}

private void ListView_SelectionChanged(object sender, EventArgs e)
{
    if(flag_cell_edited)
    {
        ListView.CurrentCell = ListView(currentColumn, currentRow);
        flag_cell_edited = false;
    }
}

添加行

static DataGridView _dg;
SqlDataAdapter _da;

public void Add()
    {
        sc.Open();

        try
        {
            using (cmd = new SqlCommand(@"INSERT INTO TableVotersInfo (Education, idnum, FirstName, MiddleName, LastName, SchoolYear, ControlNum, VResult)
                                    SELECT @ed, @idnum, @firstname, @middlename, @lastname, @schoolyear, @controlnum, 'Not Voted' 
                                    WHERE @idNum NOT IN (SELECT idNum FROM TableVotersInfo);", sc))
            {
                Param();

                var rowsAffected = cmd.ExecuteNonQuery();
                if (rowsAffected == 0)
                {
                    MessageBox.Show("ID number already exist!");
                    FAddVoters._checkID = checkID;
                    FAddVoters._cleardata = "0";
                }
                else
                {
                    MessageBox.Show("Data Stored Successfully!");
                    FAddVoters._cleardata = cleardata;
                    FAddVoters._checkID = "0";
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            sc.Close();
        }
    }


public void retList()
{
    sc.Open();
    cmd = new SqlCommand("SELECT * FROM TableVotersInfo", sc);

    try
    {
        _da = new SqlDataAdapter();
        _da.SelectCommand = cmd;
        DataTable _dt = new DataTable();
        _da.Fill(_dt);
        BindingSource bs = new BindingSource();
        bs.DataSource = _dt;
        _dg.DataSource = bs;
        _da.Update(_dt);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        sc.Close();
    }
}

【问题讨论】:

  • 您写了有关 datagridview 的文章,但您使用的是 listview(或者您只是使用了糟糕的选择名称)。那是什么?您要么发布了错误的代码,要么是混淆了组件。
  • 不,我只是想把它命名为ListView
  • Sweet,下次再把我们弄糊涂一点:)
  • 好的,抱歉...

标签: c# winforms datagridview


【解决方案1】:

您可以像这样使用RowsAdded 事件:

DataGridViewRow lastSelected;
//RowsAdded event handler for your dataGridView1
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e){
    if (dataGridView1.CurrentCell != null) 
       dataGridView1.CurrentCell.OwningRow.Selected = false;
    if (lastSelected != null) lastSelected.Selected = false;
    lastSelected = dataGridView1.Rows[e.RowIndex];
    lastSelected.Selected = true;
}

注意:该代码仅用于添加的单行。如果添加多行,将选择其中的第一个。

【讨论】:

  • 它没有转到新添加的行或 datagridview 的最后一行。我已将 selectionmode 设置为 FullRowSelect,是否存在冲突?
  • @LyndonBrozTonelete 你知道如何注册RowsAdded 事件处理程序吗?它应该工作。 SelectionMode 没关系。
  • 是的,我知道如何添加事件处理程序。我从 datagridview 中删除了所有数据,然后我尝试再次添加。对于添加的第一次和第二次尝试,它仍然是重点。但是当它在第三次时它不再聚焦了。
  • @LyndonBrozTonelete 你如何添加行?如果您以编程方式(使用代码)添加行,则此代码应该可以工作,如果您通过 DataGridView 添加行,则可能与您的预期不同。
  • @LyndonBrozTonelete 您的Add() 方法只是将新行插入到您的数据库表中,它不会更新您的DataGridView 中的任何内容,retList 基本上是错误的。如果您想以正确的方式使用DataGridView,则必须通过DataAdapter 使用DataSourceUpdateAdd() 中的所有代码都称为dealing directly and manually with the database,根本没有使用任何类型的Adapter
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多