Здравствуйте, я изучаю С#, и у меня есть небольшое сомнение, у меня есть массив, содержащий объекты класса гитары и подкласса фортепиано, и форма с dataGridView1, но когда я делаю dataGridView1.DataSource = my_array только данные появляется класс гитары.

Вот мои классы

    class guitar
{
    private string make;
    private string model;
    private int year;

    public guitar(string Make, string Model, int Year)
    {
        make = Make;
        model = Model;
        year = Year;
    }

    public string Make
    {
        get { return make; }
        set { make = value; }
    }

    public string Model
    {
        get { return model; }
        set { model = value; }
    }

    public int Year
    {
        get { return year;  }
        set { year = value; }
    }

}

Подкласс пианино

    class piano : guitar
{
    private int numKeys;

    public piano(int NumKeys, string Make, string Model, int Year) :base (Make,Model,Year)
    {
        numKeys = NumKeys;
    }

    public int NumKeys
    {
        get { return numKeys; }
        set { numKeys = value; }
    }

}

Моя форма

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    guitar[] my_array = new guitar[6]; 

    private void Form1_Load(object sender, EventArgs e)
    {
        my_array[0] = new guitar("Gibson", "Les Paul", 1958);
        my_array[1] = new guitar("Fender", "Jazz Bass", 1964);
        my_array[2] = new guitar("Guild", "Bluesbird", 1971);
        my_array[3] = new piano(50, "Josh", "Yellowbird", 2011);
        my_array[4] = new piano(10, "Albert", "Redbird", 9992);
        my_array[5] = new piano(20, "John", "Pinkbird", 1234);
 
        dataGridView1.DataSource = my_array;         
    }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        
    }   
}

Как заставить dataGridView1 отображать значения класса гитары и подкласса фортепиано, используя мой массив?

Примечание. Я использую vs2015.

c#
0
Osul 3 Фев 2022 в 13:40
Классы в С# должны называться с использованием PascalCase, а не camelCase. Ваша установка класса также действительно шаткая. Фортепиано и гитара — струнные инструменты, но фортепиано точно не гитара. Возможно, они оба должны быть производными от class StringedInstrument, который, возможно, получает свои основные свойства, такие как make и name, из базы MusicalInstrument, а затем StringedInstrument добавляет такие свойства, как NumberOfStrings..
 – 
Caius Jard
3 Фев 2022 в 14:35

2 ответа

Попробуйте изменить класс источника данных на подкласс наиболее подробных столбцов. Например, измените класс piano на Instrument, добавьте поле InstrumentType и установите тип массива на Instrument:

class Instrument : guitar
{
    public InstrumentType InstrumentType;
    private int? numKeys;

    public Instrument(InstrumentType instrumentType, int? NumKeys, string Make, string Model, int Year) : base(Make, Model, Year)
    {
        InstrumentType = instrumentType;
        numKeys = NumKeys;
    }

    public int? NumKeys
    {
        get { return numKeys; }
        set { numKeys = value; }
    }
}
public enum InstrumentType
{
    Piano,
    Guitar
}

// form 
Instrument[] my_array = new Instrument[6];
private void Form1_Load(object sender, EventArgs e)
{
    my_array[0] = new Instrument(InstrumentType.Guitar, null, "Gibson", "Les Paul", 1958);
    my_array[1] = new Instrument(InstrumentType.Guitar, null, "Fender", "Jazz Bass", 1964);
    my_array[2] = new Instrument(InstrumentType.Guitar, null, "Guild", "Bluesbird", 1971);
    my_array[3] = new Instrument(InstrumentType.Piano, 50, "Josh", "Yellowbird", 2011);
    my_array[4] = new Instrument(InstrumentType.Piano, 10, "Albert", "Redbird", 9992);
    my_array[5] = new Instrument(InstrumentType.Piano, 20, "John", "Pinkbird", 1234);
    dataGridView1.DataSource = my_array;
}
0
yu yang Jian 3 Фев 2022 в 16:59

Попробуйте DataTable:

            DataTable dt = new DataTable("Guitars");
            dt.Columns.Add("Make", typeof(string));
            dt.Columns.Add("Model", typeof(string));
            dt.Columns.Add("Year", typeof(int));

            dt.Rows.Add(new object[] {"Gibson", "Les Paul", 1958});
            dt.Rows.Add(new object[] {"Fender", "Jazz Bass", 1964});
            dt.Rows.Add(new object[] {"Guild", "Bluesbird", 1971});

            dataGridView1.DataSource = dt;
-2
jdweng 3 Фев 2022 в 13:52