2012-05-23 3 views
1

Я пытаюсь сохранить выбранную строку элемента управления DataGridView после обновления данных. Это мой кодПоддержание выделенной строки элемента управления DataGridView после обновления данных

public partial class frmPlant : Form 
    { 
     string gSelectedPlant; 

    private void frmPlant_Load(object sender, EventArgs e) 
     { 
      dataGridView1.AutoGenerateColumns = true; 
      dataGridView1.DataSource = bindingSource1; 
      FillData(); 

      dataGridView1.DataMember = "Table"; 
} 
private void FillData() 
     { 
      ds = _DbConnection.returnDataSet(_SQlQueries.SQL_PlantSelect); 
      bindingSource1.DataSource = ds.Tables[0]; 
     } 
public DataSet returnDataSet(string txtQuery) 
     { 
      conn.Open(); 
      sqlCommand = conn.CreateCommand(); 
      DB = new SQLiteDataAdapter(txtQuery, conn); 
      DS.Reset(); 
      DB.Fill(DS); 
      conn.Close(); 
      return (DS); 
     } 
    private void dataGridView1_Selectionchanged(object sender, EventArgs e) 
     { 
      if (dataGridView1.SelectedRows.Count > 0) 
      { 
       gSelectedPlant = dataGridView1.SelectedRows[0].Cells["PlantId"].Value.ToString(); 
      } 
     } 

     private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
     { 
      int selectedIndex; 
      if (!string.IsNullOrEmpty(gSelectedPlant) && e.ListChangedType == ListChangedType.Reset) 
      { 
       if (ds.Tables.Count > 0) 
       { 
        selectedIndex = bindingSource1.Find("PlantId", gSelectedPlant); 
        if (selectedIndex <= 0) 
         selectedIndex = 0; 
        dataGridView1.Rows[selectedIndex].Selected = true; 
       } 
       else 
       { 
        gSelectedPlant = string.Empty; 
       } 
      } 
     } 
    } 

Это все еще не в состоянии поддерживать RowIndex выбранной строки. Он прокручивается до строки1. Вот блог я http://www.makhaly.net/Blog/9

Предположим, я выбираю строку на Form1 (где весь этот код) и перейти в следующий класс, который показывает мне подробную информацию Abt конкретного завода. Если я снова вернусь к этой первой форме, нажав кнопку «Назад», строка сбрасывается до 1. gSelectedPlant принимает значение 1 и selectedindex = 0. Это имеет смысл, но я пока не могу понять, как поддерживать значение gSelectedPlant. Да, он принимает нулевой интинентально, но при сборе данных составляет 1.

+1

ли вы пытаетесь поставить точку останова на DataBindingComplete и посмотреть, если это проходит через проверки, также если он находит значение SelectedIndex – Habib

+0

. Положите точку останова и проверьте последовательность событий, запускаемых при первом запуске события dataGridView1_DataBindingComplete. Поэтому, я думаю, именно поэтому переменная gSelectedPlant не поддерживает правильное значение. – Talha

+0

Вы пытались добавить логическое сохранение выполнения SelectionChanged? –

ответ

0

Вы пробовали отладить его? Я не могу попробовать, так как не знаю, когда вы вызываете FillData, кроме события загрузки форм, но я не думаю, что это тот момент, когда у вас есть проблема. Я подозреваю, что проблема в том, что вы всегда пропускаете часть выбора dataGridView1_DataBindingComplete, потому что gSelectedPlant всегда пуст или установлен в первую строку.

Это обычно происходит потому, что SelectionChanged уволен много раз, чем вы думаете, в частности, он вызывается перед DataBindingComplete. Это означает, что когда вы вызываете FillData, вы должны «инструктировать» вашу форму, чтобы игнорировать события SelectionChanged до тех пор, пока не будет выполнен DataBindingComplete. Это может быть сделано модифицирующий ваш код что-то вроде этого:

public partial class frmPlant : Form 
{ 
    string gSelectedPlant; 
    bool ignoreSelChg = false; // <- added this bool  

    private void frmPlant_Load(object sender, EventArgs e) 
    { 
      dataGridView1.AutoGenerateColumns = true; 
      dataGridView1.DataSource = bindingSource1; 
      FillData(); 

      dataGridView1.DataMember = "Table"; 
    } 

    private void FillData() 
    { 
      ignoreSelChg = true; // <- set the bool, SelectionChanged won't do anything now 

      ds = _DbConnection.returnDataSet(_SQlQueries.SQL_PlantSelect); 
      bindingSource1.DataSource = ds.Tables[0]; 
    } 

    public DataSet returnDataSet(string txtQuery) 
    { 
      conn.Open(); 
      sqlCommand = conn.CreateCommand(); 
      DB = new SQLiteDataAdapter(txtQuery, conn); 
      DS.Reset(); 
      DB.Fill(DS); 
      conn.Close(); 
      return (DS); 
    } 

    private void dataGridView1_Selectionchanged(object sender, EventArgs e) 
    { 
      if (ignoreSelChg) // <- don't do anything before DataBindingComplete 
       return; 

      if (dataGridView1.SelectedRows.Count > 0) 
      { 
       gSelectedPlant = dataGridView1.SelectedRows[0].Cells["PlantId"].Value.ToString(); 
      } 
    } 

    private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
     { 
      int selectedIndex; 
      if (!string.IsNullOrEmpty(gSelectedPlant) && e.ListChangedType == ListChangedType.Reset) 
      { 
       ignoreSelChg = false; // <- reset the bool, SelectionChanged get executed again 

       if (ds.Tables.Count > 0) 
       { 
        selectedIndex = bindingSource1.Find("PlantId", gSelectedPlant); 
        if (selectedIndex <= 0) 
         selectedIndex = 0; 
        dataGridView1.Rows[selectedIndex].Selected = true; 
       } 
       else 
       { 
        gSelectedPlant = string.Empty; 
       } 
      } 
     } 
    } 

Вы можете взглянуть на посты Марка Rideout здесь: [http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/01f937af-d0d0-4de5-8919-088e88c5af77/][1]

+0

У меня есть кнопка возврата из другой формы2 в эту форму1. Как только я нажимаю кнопку «Назад», я перезаряжаю сетку (Filldata). Здесь мне нужно сохранить выбранную строку. Да, правильно. gSelectedplant либо null, либо установлен в 1 – user575219

+0

И работает ли мое решение? –

+0

@ Франческо Baruchelli. Это не. Проблема с Myform.show. http://stackoverflow.com/questions/10761154/form-show-causing-to-loose-row-selection. Пожалуйста, помогите мне. Должно быть, сегодня – user575219

-1

Вы проверили bindingSource1.Find («PlantId», gSelectedPlant); возвращает правильный индекс строки?

+0

Его не ответ, вы можете разместить его в качестве комментария под OP – Habib

+0

Да. По ошибке я добавил. –

0
//public area 
int selectedID,rowIndex, scrollIndex; 
bool IsSelectedRow; 

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.RowIndex < 0) 
      return; 
     selectedID = (int)DataGridView1.SelectedRows[0].Cells[0].Value; 
     scrollIndex = DataGridView1.FirstDisplayedScrollingRowIndex; 
     IsSelectedRow = true; 
    } 

    private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
      { 
       if (IsSelectedRow) 
       { 
        foreach (DataGridViewRow row in DataGridView1.Rows) 
        { 
         if (row.Cells[0].Value.ToString().Equals(selectedID.ToString())) 
         { 
          rowIndex = row.Index; 
          break; 
         } 
        } 
        DataGridView1.Rows[rowIndex].Selected = true; 
       }   
      } 
Смежные вопросы