1

これが私がやろうとしていることです。コードを使用して読み取っているデータベースがあります。

OleDbCommand command;
command = new OleDbCommand("SELECT " + Student.ID + " FROM " + newStudent.DataFile, conn);
conn.Open();
dt.Load(command.ExecuteReader());
conn.Close();

次に、datatableをdatagridviewにバインドして、テーブルの内容を表示します。問題は、データベースにないデータテーブルdtに追加する情報が増えたことです。たとえば、データファイルにはないが、ユーザーによって入力され、学生オブジェクトのプロパティに格納されているGradeという学生オブジェクトのフィールドがあります。

クエリ結果をデータテーブルにロードする代わりに、リストにロードして、別のメソッドでデータテーブルの行と列を手動で作成し、リストの内容(IDを含む)と成績情報を追加する方法はありますか?学生オブジェクトに手動で?

4

2 に答える 2

0

@Basが提案しているような本格的なORMフレームワークを使いたくない場合は...

DatatableのDataviewから利用できるToTableメソッドを見てください。DataTable.DefaultViewを使用するだけで、DatatableのDataViewを取得できます。

List<Long> myList = dt.DefaultDataView.ToTable(True, "ID").AsEnumerable().ToList()
myList.Add(1234)
//etc

または、追加する追加データを2番目のデータテーブルに読み込んで、DataTable.Mergeメソッドを使用することもできます。

編集:列を追加したいことを説明するために、上記のリストの提案を次のように変更できます。

// Create a class to hold the information you want to bind, 
// you could use anonymous types if preferred
class MyDataRow
{
    public long ID { get; set; }
    public string AnotherColumn { get; set; }
    public string AndAnotherColumn { get; set; }
}

// then later on when creating that list use something along the lines of:
List<MyDataRow> myList = dt.DefaultDataView.ToTable(True, "ID").AsEnumerable().Select(x => new MyDataRow { ID = x.ID }).ToList()
// you now have a list of MyDataRow which you can work with
// for example...
if (myList.Any())
    myList.First().AnotherColumn = "foo";

// as an exmaple of using an anoymous type (not my preference, but an option nonetheless)
var anonymousList = dt.DefaultDataView.ToTable(True, "ID").AsEnumerable().Select(x => new { ID = x.ID, whateverYouWantToCallIt = "some other data but this is read only property" }).ToList()
// you can work with the anonymous list in much the same way, it just isn't explicitly declared
// and the properties are Read Only
if (anonymousList.Any())
    Console.WriteLine(anonymousList.First().whateverYouWantToCallIt);
于 2011-06-23T14:54:02.520 に答える
0

Entity Frameworkを使用して、データベースからオブジェクトモデルを抽出できます。その後、gradeのプロパティをオブジェクトに追加できます(これらのオブジェクトは部分的なクラスで作成されるため)。これにより、データ構造にカスタムロジックと属性を追加する(大幅に)構造化された/使いやすい方法が提供されます。

従来のADO.NETを使用する場合と同様の方法で、GUIコンポーネントをエンティティフレームワークオブジェクトにバインドできます。

于 2011-06-23T14:46:42.877 に答える