1

我有一个带有 3 个选项卡的表单的项目,每个选项卡包含 1 个 datagridview。我禁用了多选,只能选择一行。

我需要从这三个数据网格中添加新数据行或修改数据行,因此我在窗口顶部有一个 MenuStrip,其中有一个带有“添加”、“修改”和“删除选定行”选项的菜单。

我如何知道当前选定的选项卡中当前正在选择哪一行,该选项卡包含包含该行的数据网格?因为有 3 个选项卡包含 3 个数据网格。我不想让输出说选择了 3 个 datagridviews 选择了任何行。我想要屏幕上的一行。

如果我的问题不够清楚,请问我。

4

5 回答 5

2

我假设这个问题是关于WinForms. 下面有一个示意性的代码逻辑示例,用于单击表单上属于a 的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());
        }
    }
}

对于 .NET Framework 2.0,您可以找到所选选项卡的第一个DataGridView控件(如果存在),如下所示:

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

在您的回发事件中,也许检查选择了哪个选项卡(if 语句、case 语句),然后采取特定操作来相应地修改您的数据和页面。

如果您想为数据网格调用另一个 VS 生成的回发函数,您必须正确传递参数 - 我相信源应该是数据网格中的行对象。

另一种选择可能是修改数据、重新查询并将结果绑定到适当的网格(而不是尝试使用网格事件)。

于 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 回答
0

一种不依赖于 datagridview 名称的方法:

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

(可能会添加一个测试以验证标签页是否具有数据网格视图)

于 2013-01-21T13:56:42.320 回答