2012-04-18 6 views
0

アダプタから入力するリストビューがあります。私の元のコードは、データがテーブルから返されていましたが、今は結合でクエリからコードを取得する必要がありますので、私が使用したサンプルは機能しなくなり、クエリの使用方法を見つけることができませんでしたこのため。私はORMrepositoryを使用しています。私ORMrepositoryで 私は実際に私が望むデータを返します。この機能アダプタのクエリをリストビュー用に使用する

 public IList<Coe> GetmyCoe() 
    { 
     using (var database = new SQLiteConnection(_helper.WritableDatabase.Path)) 
     { 
     string query = "SELECT Coe.Id, Adult.LName + ', ' + Adult.MName AS Name, Coe.Createdt FROM Adult INNER JOIN Coe ON Adult.CoeMID = Coe.Id"; 
     return database.Query<Coe>(query); 
     } 
    } 

を持っています。 私の活動ページにはこれがあります。

_list = FindViewById<ListView>(Resource.Id.List); 
    FindViewById<ListView>(Resource.Id.List).ItemClick += new System.EventHandler<ItemEventArgs>(CoeList_ItemClick); 

    var Coe = ((OmsisMobileApplication)Application).OmsisRepository.GetmyCoe(); 
    _list.Adapter = new CoeListAdapter(this, Coe); 

マイアダプタのページでは、私は問題を抱えているところ、私はそれは私はもうやってないよテーブルを見ているのに設定されている知っています。しかし、今私はそれにどのように渡しているのか変更する方法はわかりません。現在CoeListAdapterは次のようになります。それはデータに渡され使用できるように

public class CoeListAdapter : BaseAdapter 
{ 
    private IEnumerable<Coe> _Coe; 
    private Activity _context; 

    public CoeListAdapter(Activity context, IEnumerable<Coe> Coe) 
    { 
     _context = context; 
     _Coe = Coe; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     var view = (convertView 
      ?? _context.LayoutInflater.Inflate(
       Resource.Layout.CoeListItem, parent, false) 
       ) as LinearLayout; 
     var Coe = _Coe.ElementAt(position); 
     view.FindViewById<TextView>(Resource.Id.CoeMID).Text = Coe.Id.ToString(); 
     //view.FindViewById<TextView>(Resource.Id.GrdnMaleName).Text = Coe.Name; 
     view.FindViewById<TextView>(Resource.Id.CreateDt).Text = Coe.CreateDt; 
     return view; 
    } 

    public override int Count 
    { 
     get { return _Coe.Count(); } 
    } 

    public Coe GetCoe(int position) 
    { 
     return _Coe.ElementAt(position); 
    } 

    public override Java.Lang.Object GetItem(int position) 
    { 
     return null; 
    } 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 
} 

私はCoeListAdapter.csページを設定するにはどうすればよいです。ご覧のように、Coe.NameはCoeのテーブルモデルにないので、TextViewを埋めている行がコメントアウトされています。クエリで返されます。私は自分の問題がIEnumerableだと信じていますが、私はそれを何に変更しますか?私はモバイル開発とスーピングVS2010 Monoを新しくしました

答えて

0

問題はおそらく、ビューの作成ではなくオブジェクトのバインディング/マッピングにあります。 おそらくより具体的には、クエリです。

Adult.LName + ', ' + Adult.MName AS Name 

これは次のようになります。

Adult.LName || ', ' || Adult.MName AS Name 

も参照してください:sqliteのドキュメントからString concatenation does not work in SQLite

単項演算子+です:見出しが演算子の下http://www.sqlite.org/lang_expr.htmlノーオペレーション。これは文字列、 の数値、blobまたはNULLに適用することができ、常に同じ 値を持つ結果をオペランドとして返します。

等号には2つのバリエーションがあり、 演算子には等しくないことに注意してください。等しいは=または==のいずれかです。等しくない演算子は、 のいずれかにすることができます!=または<>です。 ||演算子は「連結」されています。 に、そのオペランドの2つの文字列を結合します。演算子%は右オペランドを法とする左オペランドの値 を出力します。

バイナリ演算子の結果は、数値またはNULLのいずれかです( )。ただし、||連結演算子は常にNULLまたはテキスト値のいずれかである に評価されます。

これは、+がゼロと評価されることを示しています。 ||を使用すると、値は正しい値またはNULL(Adult.LNameまたはAdult.MNameのいずれかがNULLの場合)になります。 これにより固定することができる。

coalesce(first, '') || ', ' || coalesce(second, '') 

これは, LastName又はFirstName,もたらし得ます。 もう1つの方法は、LNameMNameというCoeに別の2つのプロパティを作成することです。これはおそらく、あなたが名前をまず、ミドルネームとラストネームでの異なる組み合わせがある場合は特に表示方法を変更することができますように良くなる

public string Name 
{ 
    get { return string.Join(", ", LName, MName); } 
} 

: 次に、これらのプロパティに値をバインドし、このような名前のプロパティを使用します別の場所。

とトピックオフ:

私は私の問題は、IEnumerableをであると信じて...

それが正しい値を返すように、これはおそらく、あまりにも真ではありません。 IEnumerableは、コレクションが実際にリストであることを知らないので、アイテムを取得するたびにリストを繰り返し処理するので、IListを使用する方がよいでしょう。

0

私は間違っていたことが分かりました。問題を解決しました.Greg Shackles氏がデータベースを使ってセットアップする方法を使っていました。私がしなければならなかったことは、私が望んでいた要素で新しいモデルを作り出すことでした。だから私は新しいモデルを作成し、それをCoeListと呼んで、ListまたはIEnumerableをListまたはIEnumerableに変更しました。

関連する問題