第三个DataGridView Selection_Changed事件未触发(但其他2个事件)

时间:2018-04-24 19:35:06

标签: c# list datagridview windows-forms-designer

我正在使用Windows Forms和我的3 DGV显示器中的2个正确显示在文本框中,但第三个赢了。虽然我在设置它们时没有做任何不同的事情,这就是为什么我有点困惑为什么它不会起作用。我正在制定自己的练习项目,以便在下周审查我们的期末考试,所以这不是任何学分的作业。

我有一个包含三个不同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,它将在文本框中显示信息,但我需要它在那里,而不必点击任何东西。我在MacBook Pro上使用VirtualBox和Visual Studio。我看过类似的帖子,但解决方案没有改变。我想我已经添加了所有需要的代码,但这里是数据绑定方法以防万一。

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;
        }
    }

以及它的外观,供参考。

Sample WinForm

希望这很好,谢谢你的帮助。

0 个答案:

没有答案