1

データを更新した後、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;
                }
            }
        }
    }

選択した行の行インデックスを維持することはまだできません。行 1 にスクロールします。私が使ったブログはこちら http://www.makhaly.net/Blog/9

Form1 (このコードがすべてある場所) の行を選択し、次のフォームに進むと、特定の Plant に関する詳細情報が表示されます。この最初のフォームに戻ると、[戻る] ボタンを押して、行が 1 にリセットされます。gSelectedPlant は値 1 と selectedindex = 0 を取ります。 gSelectedPlant の。はい、最初は null を取りますが、databindingcomplete では 1 になります。

4

3 に答える 3

0

デバッグしてみましたか?フォームの読み込みイベントは別として、いつFillDataを呼び出すかわからないので試すことはできませんが、問題がある点ではないと思います。gSelectedPlant が常に空であるか、最初の行に設定されているため、 dataGridView1_DataBindingComplete の選択部分を常にスキップすることが問題であると思われます。

これは通常、SelectionChanged が思ったよりも多く発生するために発生します。特に、DataBindingComplete の前に呼び出されます。これは、FillData を呼び出すときに、DataBindingComplete が実行されるまで、SelectionChanged イベントを無視するようにフォームに「指示」する必要があることを意味します。これは、次のようにコードを変更することで実行できます。

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;
                }
            }
        }
    }

ここでMark Rideoutの投稿を見ることができます:[http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/01f937af-d0d0-4de5-8919-088e88c5af77/][1]

于 2012-05-23T04:57:47.380 に答える
-1

bindingSource1.Find("PlantId", gSelectedPlant); を確認しましたか? 正しい行インデックスを返していますか?

于 2012-05-23T04:53:12.773 に答える