0

我有一个带有表'BikeInfo'的sqlite数据库

[BikeID, BikeName]

现在我希望我的pickerview 填充这个数据库中的自行车名称。在 .Net 中,这很容易。但是作为 MonoTouch 的一个完整的初学者,我不知道如何解决这个问题。我做了一些谷歌搜索,发现我必须创建某种从该类扩展的自定义UIPickerViewModel类并覆盖其各种方法。但仅此而已。我找不到任何示例代码、教程或任何东西。我已经为此奋斗了三天。我完全糊涂了。到目前为止,我已经编写了一个函数,它从表中获取数据并返回一个类对象列表[我编写的包含属性 BikeName 和 BikeId]。也许我在寻找所有错误的地方。但我需要以任何方式完成这项工作。

任何类型的教程或 C# 中处理此特定目标场景的示例代码都会对我有所帮助。

下一个目标是在用户触摸一个特定项目时显示一条警报消息,显示相应的自行车 ID。我认为我们必须在该自定义类中定义选定的事件。这是我从互联网上挑选的。

谢谢。


这是我到目前为止所做的。我创建了一个包含属性BikeIDBikeName.

namespace ASTONAPP
{
    public class PickerFacilityTemplate
    {
        public PickerFacilityTemplate ()
        {
        }

        public int BikeID{get; set;}
        public string BikeName{get; set;}
    }
}

之后,我在我的数据库处理程序类中编写了该函数,该函数返回上述类类型的类对象列表。

public List<PickerFacilityTemplate> FetchFacility()
{
    DataSet ds = new DataSet ();
    string sql = "select * from BikeInfo order by BikeName";
    this.CreateDBConnection ();
    SqliteDataAdapter sda = new SqliteDataAdapter (sql, sconn);
    sda.Fill (ds);
    List<PickerFacilityTemplate> objfcl=new List<PickerFacilityTemplate>();

    for(int i=0; i<ds.Tables[0].Rows.Count; i++)
    {
        PickerFacilityTemplate pft=new PickerFacilityTemplate();
        pft.BikeID=Convert.ToInt32(ds.Tables[0].Rows[i]["BikeID"].ToString());
        pft.BikeName=ds.Tables[0].Rows[i]["BikeName"].ToString ();
        objfcl.Add (pft);
    }

    this.CloseDBConnection ();
    return objfcl.ToList ();
}

public class PickerDataModelSource: UIPickerViewModel
{
    public PickerDataModelSource ()
    {
    }

    public PickerDataModelSource (List<PickerFacilityTemplate> lst)
    {
        this.Items=lst;
    }

    public event EventHandler<EventArgs> ValueChanged;

    public List<PickerFacilityTemplate> Items;

    List<PickerFacilityTemplate> _items = new List<PickerFacilityTemplate>();

    public PickerFacilityTemplate SelectedItem 
    {
        get 
        { 
            return this._items[this._selectedIndex];                
        } 
    }

    public int _selectedIndex = 0;

    public override int GetRowsInComponent (UIPickerView picker, int component) 
    {
        return this._items.Count;
    }

    public override string GetTitle (UIPickerView picker, int row, int component) 
    {
        return items[row].BikeName.ToString();

    }
    public override int GetComponentCount (UIPickerView picker) 
    {
        return 1;
    }

    public override void Selected(UIPickerView picker, int row, int component)
    {
        this._selectedIndex = row;
        if (this.ValueChanged != null) 
        {
            this.ValueChanged (this, new EventArgs ());
        }
    }
}

现在在我有pickerview的屏幕的类文件中,我写了,

PickerDataModelSource _pickerSource;

并在ViewDidLoad方法中:

this.Picker.Source=this._pickerSource;
this.Picker.Model=this._pickerSource;

但是当我运行应用程序时,我的pickerview 是空白的。我错过了什么吗?我的逻辑错误在哪里?

谢谢。

4

1 回答 1

0

如何使用选取器的一个示例是“厨房水槽”示例 - https://github.com/xamarin/monotouch-samples/tree/master/MonoCatalog-MonoDevelop - 特别是在https://github.com/xamarin /monotouch-samples/blob/master/MonoCatalog-MonoDevelop/PickerViewController.xib.cs

总的来说,我发现 repo 对于许多 mt 开发任务都是必不可少的。

于 2012-07-07T16:42:47.847 回答