4

次のように定義されたカスタム データセット スタイル クラスがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace LibrarySort.Data
{
  public class LibraryData
  {
    private AlbumList albums;
    public AlbumList Albums { get { return albums; } }

    public LibraryData()
    {
      this.albums = new AlbumList();
      this.albums.AllowEdit = true;
      this.Albums.AllowNew = true;
      this.Albums.AllowRemove = true;
    }

    public void FillAll()
    {
      this.Albums.Fill();
    }
  }

  public class AlbumList : BindingList<Album>
  {
    public AlbumList()
    {
    }

    public void Fill()
    {
      int id = 1;
      Album album1 = new Album();
      album1.Id = id++;
      album1.Artist = "Classical Piano Artist";
      album1.Download = true;
      album1.Person = null;
      album1.Price = (decimal?)3.49;
      album1.Tags.Add("classical");
      album1.Tags.Add("piano");
      album1.Title = "Classical Piano";
      Album album2 = new Album();
      album2.Id = id++;
      album2.Artist = "Thrash Metal Artist";
      album2.Download = false;
      album2.Person = null;
      album2.Price = (decimal?)7.99;
      album2.Tags.Add("thrash metal");
      album2.Title = "Thrash Metal";

      this.Items.Add(album1);
      this.Items.Add(album2);
    }
  }
}

また、TabControl 内に DataGridView を持つ Form オブジェクトもあります。デザイナーで BindingSource を作成し、[プロジェクト データ ソースの追加] を使用して最上位の LibraryData オブジェクトからソースを作成しました。次に、すべてデザイナーで DataGridView を "Albums" データ メンバーにバインドすると、期待どおりに列がデザイナーに入力されます。

コードを実行すると、テーブルにデータが入力されません。これは、Fill() が実行されていないため意味があります。そこで、次のようにフォームの Load イベント ハンドラーを作成します。

private void MainForm_Load(object sender, EventArgs e)
{
  LibraryData data = (LibraryData)bindingSource.DataSource;
  data.FillAll();
}

ただし、実行時に MainForm_Load() で次のようになります。

System.InvalidCastException は処理されませんでした Message="Unable to cast object of type 'System.RuntimeType' to type 'LibrarySort.Data.LibraryData'

私はこれについて広範囲にグーグルで検索しましたが、StackOverflow ではうまくいきませんでした。何か不足していますか?

更新: DataSource は間違いなく null ではありません。また興味深いことに、デザイナー コードでは次のように表示されます。

this.bindingSource.DataSource = typeof(LibrarySort.Data.LibraryData);

更新 2: アルバム クラスと親アイテム:

namespace LibrarySort.Data
{
  public class Album : Item
  {
    bool download = false;
    public bool Download { get { return download; } set { download = value; } }

    string artist = null;
    public string Artist { get { return artist; } set { artist = value; } }
  }
}

namespace LibrarySort.Data
{
  public class Item
  {
    int id = -1;
    public int Id { get { return id; } set { id = value; } }

    // FK to Person that currently has possession of item
    int? person = null;
    public int? Person { get { return person; } set { person = value; } }

    string title = null;
    public string Title { get { return title; } set { title = value; } }

    decimal? price = null;
    public decimal? Price { get { return price; } set { price = value; } }

    State state = State.Owned;
    public State State { get { return state; } set { state = value; } }

    List<string> tags = null;
    public List<string> Tags
    {
      get
      {
        if (tags == null)
          tags = new List<string>();
        return tags;
      }
      // No set needed
    }
  }
}
4

1 に答える 1

2

問題は、フォームにバインディング ソースがありますが、バインディング ソースのデータ ソースを設定していないことだと思います。

bindingSourceそれがdatasourceフォームにドロップしたと仮定して、 で次のことを試してMainForm_Loadください。

LibraryData data = new LibraryData();
data.FillAll();
bindingSource.DataSource = data;
于 2013-04-02T14:58:26.260 に答える