Я работаю с 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
Надеюсь, это хорошо, спасибо за помощь.