DataGridView将不能正确更新

本文关键字:更新 不能 DataGridView | 更新日期: 2023-09-27 18:05:04

所以我目前正在做一个数据库项目,但我的GUI不会正确更新。

我的程序目前有四个DataGridViews。第一个包含了所有的波段。第二个显示所选乐队的所有乐队成员。第三个显示所选乐队的所有专辑。第四个显示所选专辑的所有曲目。

当我在两个乐队之间切换时,乐队成员和专辑更新得很好。但这是我的问题:

我有两条带子。第一个在每个表中已经有几个条目。第二个只有乐队本身。

所以当我从波段1切换到波段2时,轨道DataGridView没有正确更新,仍然显示第一张专辑的轨道。就像我说的,其余的更新得很好。

下面是我的代码:
public partial class Form1 : Form
{
    MusicDB Context = new MusicDB();
    BindingSource bsSourceAlbum = new BindingSource();
    BindingSource bsSourceMember = new BindingSource();
    BindingSource bsSourceTrack = new BindingSource();
    public Form1()
    {
        InitializeComponent();
        this.AlbumDataGridView.AutoGenerateColumns = false;
        this.MemberDataGridView.AutoGenerateColumns = false;
        this.TrackDataGridView.AutoGenerateColumns = false;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        Context.cInterpret.Load();
        BindingSource bsSourceInterpret = new BindingSource();
        bsSourceInterpret.DataSource = Context.cInterpret.Local;
        InterpretDataGridView.DataSource = bsSourceInterpret;
        InterpretDataGridView.Columns[0].Visible = false;
        InterpretDataGridView.Columns[3].Visible = false;
        InterpretDataGridView.Columns[4].Visible = false;
        InterpretDataGridView.Columns["InterpretName"].HeaderText = "Interpret";
        InterpretDataGridView.Columns["InterpretFounding"].HeaderText = "Gründungsjahr";
        bsSourceInterpret.AllowNew = true;
        Context.cLabel.Load();
        AlbumLabelColumn.DataSource = Context.cLabel.Local;
        AlbumLabelColumn.DisplayMember = "LabelName";
        AlbumLabelColumn.ValueType = typeof(MusicLabel);
        AlbumLabelColumn.ValueMember = "Self";
        Context.cGenre.Load();
        AlbumGenreColumn.DataSource = Context.cGenre.Local;
        AlbumGenreColumn.DisplayMember = "GenreName";
        AlbumGenreColumn.ValueType = typeof(Genre);
        AlbumGenreColumn.ValueMember = "Self";
        Context.cInstrument.Load();
        MemberInstrumentColumn.DataSource = Context.cInstrument.Local;
        MemberInstrumentColumn.DisplayMember = "InstrumentName";
        MemberInstrumentColumn.ValueMember = "InstrumentID";
        MemberInstrumentColumn.ValueType = typeof(Instrument);
        MemberInstrumentColumn.ValueMember = "Self";
        bsSourceTrack.AllowNew = true;
        bsSourceAlbum.AllowNew = true;
        bsSourceMember.AllowNew = true;
        AlbumDataGridView.DataSource = bsSourceAlbum;
        MemberDataGridView.DataSource = bsSourceMember;
        TrackDataGridView.DataSource = bsSourceTrack;
    }
    private void InterpretDataGridView_SelectionChanged_1(object sender, EventArgs e)
    {
        //bsSourceMember.Clear();
        //bsSourceAlbum.Clear();
        DataGridView SenderGridView = (DataGridView)sender;
        if (SenderGridView.CurrentRow != null && SenderGridView.CurrentRow.DataBoundItem != null && SenderGridView.CurrentRow.DataBoundItem is Interpret)
        {
            bsSourceAlbum.DataSource = ((Interpret)((DataGridView)sender).CurrentRow.DataBoundItem).Albums;
            bsSourceMember.DataSource = ((Interpret)((DataGridView)sender).CurrentRow.DataBoundItem).Members;
        }
    }
    private void AlbumDataGridView_SelectionChanged(object sender, EventArgs e)
    {
        bsSourceTrack.Clear();
        DataGridView SenderGridView = (DataGridView)sender;
        if (SenderGridView.CurrentRow != null && SenderGridView.CurrentRow.DataBoundItem != null && SenderGridView.CurrentRow.DataBoundItem is Album)
        {
            bsSourceTrack.DataSource = ((Album)((DataGridView)sender).CurrentRow.DataBoundItem).Tracks;
        }
    }
}

DataGridView将不能正确更新

使用DataBind()方法

InterpretDataGridView.DataBind();

InterpretDataGridView_SelectionChanged_1中,您仅为其他3个网格中的2个更新绑定源,并且这些是您报告为更改的网格。

其他网格的绑定源:TrackDataGridView只从AlbumDataGridView_SelectionChanged更新-所以尝试在设置bsSourceMember.DataSource后调用它。

所以我找到了解决问题的方法。这就是我在代码中添加的内容:

    bsSourceAlbum.CurrentChanged += bsSourceAlbum_CurrentChanged;
    void bsSourceAlbum_CurrentChanged(object sender, EventArgs e)
    {
        bsSourceTrack.Clear();
        BindingSource SenderSource = (BindingSource)sender;
        if (SenderSource.Current != null && SenderSource.Current is Album)
        {
            bsSourceTrack.DataSource = ((Album)((BindingSource)sender).Current).Tracks;
        }
    }