■76163 / inTopicNo.1) |
ストアアプリ開発でDataTable,DataRowの自作 |
□投稿者/ 困り人 (1回)-(2015/06/04(Thu) 19:53:06)
|
分類:[.NET 全般]
はじめまして、この度システムの改修業務に当たり、タブレット(ストアアプリ版.NET)にて C#開発を行う事になったのですが、既存システム(VB.NET)の流用できる箇所については そのまま流用する(ロジックのみ)というような要件を受けております。
環境はWin8.1、VS2013Pro,SQLiteなどです。
当方デスクトップ版.NETでの開発経験はあるのですが、ストアアプリでの 開発は初めてであります。
いざ作業を始めようとした所、System.Data.dll関係のものが利用出来なかったり 色々制約がある事に驚きを隠せません。
残念な事に、既存システムでDataTableやDataRowなどを大量に利用しており 代替案で乗り切ることが出来ない状態になった為、仕方がなく自前で実装する方向で 話がまとまってしまいました。
実装に関しては基本的なプロパティやメソッドのみを実装したいと考えておりますが、 フレームワーク開発のような事は経験がなく、どのようにすれば良いのかわかりません。
現在最低限必要なものとして DataTable/Rowsプロパティなど DataRow/rowState/設定・変更の仕組み/値へのアクセス方法など DataRowCollection/AddやRemoveメソッドなど あとはカラム系ですが、こちらはひとまず置いておきます。 などがあります。
今回、疑似的に作成するにあたりDictionaryなどを利用して頑張ろうとしたのですが、 何をどうすれば良いのかわからずにいます。
参考にもならないと思ますが、私が書いているコードを添付させて頂き どうすれば実用に耐えうるものにできるかなどご意見を頂けないでしょうか?
サンプル
[DataRow.cs] /// <summary> /// DataRowクラス(擬似的) /// </summary> public class DataRow { /// <summary> /// データ保存用メモリ領域 /// </summary> private Dictionary<string, Object> Table = new Dictionary<string, Object>();
/// <summary> /// コンストラクタ /// </summary> public DataRow() { Table = new Dictionary<string, Object>(); this.RowState = DataRowState.Detached; }
#region アクセサー /// <summary> /// インデックス用アクセサー /// </summary> /// <param name="columnIndex">カラムのインデックス</param> /// <returns>値</returns> public Object this[int columnIndex] { get { Object result = null;
int count = 0; foreach (var row in Table) { if (count < columnIndex) { count++; continue; }
result = row.Value; break; } return result; } set { Table.Add(columnIndex.ToString(), value); this.RowState = DataRowState.Modified; columnIndex = Table.Count; } }
/// <summary> /// カラム名用アクセサー /// </summary> /// <param name="columnName">カラム名</param> /// <returns>値</returns> public Object this[string columnName] { get { Object result = null;
if (Table.ContainsKey(columnName)) { result = Table[columnName]; }
return result; } set { Table.Add(columnName, value); this.RowState = DataRowState.Modified; columnName = value.ToString(); } } #endregion
#region rowState /// <summary> /// rowState変更用 /// </summary> private DataRowState rowState;
public DataRowState RowState { get { return rowState; } set { rowState = value; } }
//[FlagsAttribute] public enum DataRowState { Added, Deleted, Modified, Detached, Unchanged }; #endregion }
[DataTable.cs] public class DataTable { public DataRow NewRow() { DataRow dr = new DataRow(); return dr; }
private DataRowCollection rows = new DataRowCollection();
public DataRowCollection Rows { get { return rows; } }
public class Columns { public void Add(DataRow dr) {
}
} }
[DataRowCollection.cs] public class DataRowCollection : System.Collections.IEnumerable { public Dictionary<string, DataRow> list = new Dictionary<string, DataRow>(); public void Add(DataRow dr) { list.Add(list.Count.ToString(), dr); }
public System.Collections.IEnumerator GetEnumerator() { return list.GetEnumerator(); } }
[MainPage.cs] //これはストアアプリのLoadイベント内のつもりで利用しています。 public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent();
DataTable dt = new DataTable(); DataRow dr = dt.NewRow(); // 値を入れてみる // 基本的にキーは文字列のみとして扱う事で良い仕様なので // dr[2]と記述した場合は、"2"というキーでの扱いになる dr["a"] = 0; dr["b"] = "string"; dr["3"] = 123; dr[2] = "string123"; // 値を確認してみる string a = dr["a"].ToString(); string b = dr[1].ToString(); string c = dr["3"].ToString(); string d = dr[3].ToString();
dt.Rows.Add(dr); // 型が違うのでエラーとなる Varで受ければいいのだが、 // 既存システムでは通用しないので困ってます foreach (DataRow dr2 in dt.Rows) { } } }
|
|