1

3つのタブがあり、それぞれに1つのdatagridviewが含まれているフォームを持つプロジェクトがあります。複数選択を無効にしましたが、行しか選択できません。

これらの3つのデータグリッドから新しいデータ行を追加するか、データの行を変更する必要があるため、ウィンドウの上部に「追加」、「変更」、「選択した行の削除」オプションのあるメニューを含むMenuStripがあります。

その行を含むデータグリッドを含む現在選択されているタブで現在選択されている行を知るにはどうすればよいですか?3つのデータグリッドを含む3つのタブがあるためです。どの行が選択されていても、3つのデータグリッドビューが選択されているという出力を取得したくありません。画面に1行表示したい。

私の質問が十分に明確でないかどうか私に尋ねてください。

4

5 に答える 5

2

この質問は についてだと思いWinFormsます。以下は、フォーム上の に属するToolStripMenuItem名前をクリックするための回路図コード ロジック サンプルです。メソッドロジックをボタンイベントに適応させるだけです。Show selected rowMenuStripModifyDeleteclick

public Form1()
{
    InitializeComponent();

    dataGridView1.DataSource = new[] { new { Id = 1 }, new { Id = 10 } };
    dataGridView2.DataSource = new[] { new { Id = 2 }, new { Id = 20 } };
    dataGridView3.DataSource = new[] { new { Id = 3 }, new { Id = 30 } };
}

private void showSelectedRowToolStripMenuItem_Click(object sender, EventArgs e)
{
    var dgv = tabControl1.SelectedTab.Controls.OfType<DataGridView>().FirstOrDefault();
    if(dgv != null)
    {
        if (dgv.SelectedRows.Count > 0)
        {
            // I'm using MessageBox to show the index of the row. 
            // You should add your Modify / Delete logic
            MessageBox.Show(dgv.SelectedRows[0].Index.ToString());
        }
    }
}

DataGridView.NET Framework 2.0 の場合、選択したタブの最初のコントロールが存在する場合は、次のように見つけることができます。

DataGridView dgv = null;
for (int i = 0; i < tabControl1.SelectedTab.Controls.Count; i++)
{
    if (tabControl1.SelectedTab.Controls[i].GetType() == typeof(DataGridView))
    {
        dgv = (DataGridView)tabControl1.SelectedTab.Controls[i];
    }
}
于 2013-01-21T13:36:35.633 に答える
1

クリックでチェックします
。タブ コントロールが tabCtrlReports で、タブ名が tbUser であると仮定し、条件をチェックします。

 If (tabCtrlReports.SelectedTab.Name = "tbUser") Then
// your code of grid
End If

C#ではただ

if (tabCtrlReports.SelectedTab.Name = "tbUser") 
{
    // your code of grid
} 
于 2013-01-21T13:26:50.490 に答える
0

datagridview の名前に依存しないアプローチ:

   var rtb = ((DataGridView)tabControl1.SelectedTab.Controls.Cast<Control>()
                  .FirstOrDefault(x => x is DataGridView)).CurrentRow;

(タブページに datagridview があることを確認するテストが追加される可能性があります)

于 2013-01-21T13:56:42.320 に答える
0

ポストバック イベントで、おそらくどのタブが選択されているか (if ステートメント、case ステートメント) を確認し、それに応じてデータとページを変更する特定のアクションを実行します。

データグリッドに対して別の VS 生成ポストバック関数を呼び出したい場合は、パラメーターを正しく渡す必要があります。ソースはデータグリッドの行オブジェクトである必要があると思います。

もう 1 つのオプションは、(グリッド イベントを使用しようとするのではなく) データを変更し、再クエリを実行して、結果を適切なグリッドにバインドすることです。

于 2013-01-21T13:32:00.537 に答える
0
DataGridViewRow row = new DataGridViewRow();
if (tabControl1.SelectedTab.Name == "Name1") 
{
     row = dataGridView1.CurrentRow;
}
else
{
    if (tabControl1.SelectedTab.Name == "Name2") 
    {
        row = dataGridView2.CurrentRow;
    }
    else
    {
        row = dataGridView3.CurrentRow;
    }

if (row != null)
{
    //your logic here
}
于 2013-01-21T13:38:41.317 に答える