Winforms 如何检查所选行在DataGridView中的类别

Winforms 如何检查所选行在DataGridView中的类别,winforms,if-statement,datagridview,Winforms,If Statement,Datagridview,我已经用google/stackoverflow搜索了一段时间,但我找不到问题的正确答案。 我必须在VS Windows窗体(.net Framework)中创建简单的程序。我创建了几个DataGridView,其中显示了我需要的确切数据。我将按钮添加到“添加”以创建新行,或“删除”所选行。现在我需要通过单击一个按钮来更改所选行中的数据。 当我单击“添加”按钮时,新对话框窗口弹出,您可以从子类Car或Motorbike中进行选择,然后当您选择要添加的内容时,新对话框将弹出,并在那里填写适当的信息

我已经用google/stackoverflow搜索了一段时间,但我找不到问题的正确答案。

我必须在VS Windows窗体(.net Framework)中创建简单的程序。我创建了几个DataGridView,其中显示了我需要的确切数据。我将按钮添加到“添加”以创建新行,或“删除”所选行。现在我需要通过单击一个按钮来更改所选行中的数据。 当我单击“添加”按钮时,新对话框窗口弹出,您可以从子类Car或Motorbike中进行选择,然后当您选择要添加的内容时,新对话框将弹出,并在那里填写适当的信息(如制造商或创建年份等)

当我想“编辑”所选行时,我希望应用程序直接进入对话框,在那里您可以将数据更改为新数据。我认为简单的“如果”可以很容易地帮助我,但我找不到创建它的代码。 我的想法是这样的:

            F1Automobil f1 = new F1Automobil();
            F1Motorka f2 = new F1Motorka();
            int indCar = dgvVozovyPark.CurrentCell.RowIndex;
            if (/*index of selected row where subclass equals to "automobil" = true)
            {
                {
                    f1.Action = F1Automobil.ActionType.Edit;
                    f1.CarInstance = (Automobil)dgvVozovyPark.CurrentRow.DataBoundItem;
                    f1.ShowDialog();
                }
            else
                {
                    f2.Action = F1Motorka.ActionType.Edit;
                    f2.BikeInstance = (Motorka)dgvVozovyPark.CurrentRow.DataBoundItem;
                    f2.ShowDialog();
                }
            }
但是VS显示了几个错误。谁能帮帮我,因为我不知道该怎么办。我尝试了很多组合,比如
数据库.Equals(something)=true
,但都不起作用

编辑:这里是具有已定义子类的基类

namespace Semestrální_projekt___Půjčovna_vozidel
{
    [Serializable()]
    public class Vozidla
    {
        public string Vyrobce { get; set; }
        public string Model { get; set; }
        public int RokVyroby { get; set; }
        public int CenaVypujcky { get; set; }
        public int CenaProdejni { get; set; }
        public Vozidla(string vyrobce, string model, int rokVyroby, int cenaVypujcky, int cenaProdejni)
        {
            Vyrobce = vyrobce;
            Model = model;
            RokVyroby = rokVyroby;
            CenaVypujcky = cenaVypujcky;
            CenaProdejni = cenaProdejni;
        }
    }
        [Serializable()]
        public class Motorka: Vozidla
        {
            public int Kubatura { get; set; }
            public string Typ { get; set; }
            public Motorka(string vyrobce, string model, int rokVyroby, int cenaVypujcky, int cenaProdejni, int kubatura, string typ)
                :base (vyrobce, model, rokVyroby, cenaVypujcky, cenaProdejni)
            {
                Kubatura = kubatura;
                Typ = typ;
            }
        }
        [Serializable()]
        public class Automobil: Vozidla
        {
            public int ObsahMotoru { get; set; }
            public string Typ { get; set; }
            public string Prevodovka { get; set; }
            public int PocetMistSezeni { get; set; }
            public Automobil(string vyrobce, string model, int rokVyroby, int cenaVypujcky, int cenaProdejni, int obsahMotoru, string typ, string prevodovka,int pocetMistSezeni)
                :base(vyrobce, model, rokVyroby, cenaVypujcky, cenaProdejni)
            {
                ObsahMotoru = obsahMotoru;
                Typ = typ;
                Prevodovka = prevodovka;
                PocetMistSezeni = pocetMistSezeni;
            }
        }
    }
这可能会有帮助

if (dgvVozovyPark.SelectedRows.Count > 0) {
  try {
    Vozidla vehicle = (Vozidla)dgvVozovyPark.SelectedRows[0].DataBoundItem;
    string className  = vehicle.GetType().Name;
    if (className.Equals("Automobil")) {
      Automobil selectedAuto = (Automobil)vehicle;
      MessageBox.Show("Open Automobil instance : " + selectedAuto.ToString());
    }
    else {
      if (className.Equals("Motorka")) {
        Motorka selectedMotor = (Motorka)vehicle;
        MessageBox.Show("Open Motorka instance : " + selectedMotor.ToString());
      }
      else {
        // unknown class
      }
    }
  }
  catch (Exception ex) {
    MessageBox.Show("Grid cast Error: " + ex.Message);
  }
}

如果有人想查看帮助,我将从@JohnG复制并粘贴答案:

这可能会有帮助

if (dgvVozovyPark.SelectedRows.Count > 0) {
  try {
    Vozidla vehicle = (Vozidla)dgvVozovyPark.SelectedRows[0].DataBoundItem;
    string className  = vehicle.GetType().Name;
    if (className.Equals("Automobil")) {
      Automobil selectedAuto = (Automobil)vehicle;
      MessageBox.Show("Open Automobil instance : " + selectedAuto.ToString());
    }
    else {
      if (className.Equals("Motorka")) {
        Motorka selectedMotor = (Motorka)vehicle;
        MessageBox.Show("Open Motorka instance : " + selectedMotor.ToString());
      }
      else {
        // unknown class
      }
    }
  }
  catch (Exception ex) {
    MessageBox.Show("Grid cast Error: " + ex.Message);
  }
}

在一所没有与老师“交流”能力的学校入学听起来很奇怪。你是如何分配任务的?如果您使用的是
DataGridView
,您是否有理由不让用户通过编辑单个单元格“直接”编辑网格中的数据?目前还不清楚您对“如果”声明有什么问题<代码>如果(grid.CurrentCell.Value.ToString()==“automobile”){…}?1)感谢链接到MS帮助。我看过那些页面,但我没有发现它们有用。2) 是的,我可以通过电子邮件问老师,但他有很多来自“每日”项目的学生,我的下一次团队会议将在一个月左右后举行,你们将讨论大部分已完成的项目。3) 我在DGV中选择的是整行,如果单击“编辑”,所有数据都将加载到该对话框窗口,您将在其中更改它们。DGV显示的是整个类别的“车辆”,而不是一辆车一辆,自行车一辆。此外,DGV显示了更多的列,因此单独更改每个网格会很痛苦。3.1)我有一个名为Vehicles的类,其中有两个子类:Cars、Bikes。DGV显示“绑定列表”中列出的所有车辆。我的“if”语句必须检查,如果选择的带有“Vehicle”的行是“Car”或“Bike”的子类,然后决定将弹出哪个对话框窗口。我对“Customer”DGV有这样的选项,但我没有此列表的子类,因此创建新/编辑按钮“非常容易”,因为“如果单击此按钮,则创建新客户,如果单击此按钮,则编辑他”