Третье событие DataGridView Selection_Changed не запускается (но другие 2 делают) - PullRequest
0 голосов
/ 24 апреля 2018

Я работаю с Windows Forms и двумя дисплеями моего 3 DGV в текстовом поле, но третий не будет.Я не сделал ничего другого при их настройке, поэтому я немного растерялся, почему это не сработало.Я работаю над своим собственным практическим проектом, чтобы подготовиться к нашему финальному экзамену на следующей неделе, так что это не задание для какого-либо кредита.

У меня есть форма с тремя различными DGV, одна для ученика, одна для предметов и одна для покемонов (наш класс часто использует покемонов).Есть также несколько текстовых полей для отображения выбранных данных.

У первого DGV просто есть студенты и идентификационные номера.Они отображаются в соответствующем текстовом поле.Эта часть отлично работает.

Ученический класс:

public class Student
{
    private string _studentName;
    private int _id;
    private List<Items> _items;
    private List<Pokemon> _pokemon;

    public string StudentName { get => _studentName; set => _studentName = value; }
    public int Id { get => _id; set => _id = value; }
    public List<Items> Items { get => _items; set => _items = value; }
    public List<Pokemon> Pokemon { get => _pokemon; set => _pokemon = value; }

    public Student()
    {
        this._items = new List<Items>();
        this._pokemon = new List<Pokemon>();
    }
}

Получение ученика до текстового поля в основной форме:

private void dgvStudent_SelectionChanged(object sender, EventArgs e)
    {
        if (dgvStudent.SelectedRows.Count == 1)
        {
            Student s = (Student)dgvStudent.SelectedRows[0].DataBoundItem;
            txtName.Text = s.StudentName;
            txtID.Text = s.Id.ToString();
            BindItemsGrid(s);
            BindPokeGrid(s);
        }
        else
        {
            BindItemsGrid(null);
            BindPokeGrid(null);
            txtName.Text = "";
            txtCWID.Text = "";
        }

Это работало нормально, поэтому я сделал нечто похожее для части предметов.Класс предметов:

public class Items
{
    private string _item;
    private int _quantity;

    public string Item { get => _item; set => _item = value; }
    public int Quantity { get => _quantity; set => _quantity = value; }

    public Items()
    {

    }

    public Items (string item)
    {
        this._item = item;
    }

    public Items(string item, int quantity)
    {
        this._item = item;
        this._quantity = quantity;
    }

Элементы для текстового поля в основной форме:

private void dgvItems_SelectionChanged(object sender, EventArgs e)
    {

        if (dgvItems.SelectedRows.Count == 1)
        {
            Items i = (Items)dgvItems.SelectedRows[0].DataBoundItem;
            txtItem.Text = i.Item;
            txtQty.Text = i.Quantity.ToString();
        }
        else
        {
            txtItem.Text = "";
            txtQty.Text = "";
        }
    }

Вот проблема, я сделал такой же код для третьего, но неважно, что я пытаюсь,он не сработает должным образом.

Класс покемонов:

public class Pokemon
{
    private string _pokename;
    private string _nickname;
    private string _type;
    private int _hp;
    private int _level;

    public string PokeName { get => _pokename; set => _pokename = value; }
    public string Nickname { get => _nickname; set => _nickname = value; }
    public string Type { get => _type; set => _type = value; }
    public int Hp { get => _hp; set => _hp = value; }
    public int Level { get => _level; set => _level = value; }

    public Pokemon()
    {

    }

    public Pokemon(string name)
    {
        this._pokename = name;
    }

    public Pokemon(string name, string nickname, string type, int hp, int level)
    {
        this._pokename = name;
        this._nickname = nickname;
        this._type = type;
        this._hp = hp;
        this._level = level;
    }

, затем в основной форме:

private void dgvPokemon_SelectionChanged(object sender, EventArgs e)
    {

        if (dgvPokemon.SelectedRows.Count > 0)
        {
            Pokemon p = (Pokemon)dgvPokemon.SelectedRows[0].DataBoundItem;
            txtPokeName.Text = p.PokeName;
            txtNickname.Text = p.Nickname;
            txtType.Text = p.Type;
            txtHP.Text = p.Hp.ToString();
            txtLevel.Text = p.Level.ToString();
        }

        else
        {
            MessageBox.Show("Error?");

            txtPokeName.Text = "";
            txtNickname.Text = "";
            txtType.Text = "";
            txtHP.Text = "";
            txtLevel.Text = "";
        }
    }

Это длинный пост, и я прошу прощения, япросто хочу дать как можно больше подробностей.Я попытался поместить MessageBox.Show внутри и снаружи оператора if, чтобы увидеть, попадет ли он туда, и они никогда не будут отображаться. Я попытался удалить оператор if, я попытался использовать CellClick вместо SelectionChanged, и это отобразитинформация в текстовых полях, но мне нужно, чтобы она была там, не нажимая ничего.Я использую VirtualBox и Visual Studio на MacBook Pro.Я читал похожие посты, но решения ничего не меняют.Я думаю, что я добавил весь необходимый код, но вот методы привязки данных на всякий случай.

private void BindGrid()
    {
        dgvStudent.DataSource = typeof(List<Student>);
        dgvStudent.DataSource = _roster;
    }

    private void BindItemsGrid(Student s)
    {   dgvItems.DataSource = typeof(List<Items>);
        if (s != null)
        {
            dgvItems.DataSource = s.Items;
        }
    }

    private void BindPokeGrid(Student s)
    {
        dgvPokemon.DataSource = typeof(List<Pokemon>);
        if (s!= null)
        {
            dgvPokemon.DataSource = s.Pokemon;
        }
    }

и как это выглядит, для справки.

ПримерWinForm

Надеюсь, это хорошо, спасибо за помощь.

...