首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以像我的WinForms代码一样,在Xamarin中轻松地将网格绑定到表?

问有没有一种方法可以像我的WinForms代码一样,在Xamarin中轻松地将网格绑定到表?
EN

Stack Overflow用户
提问于 2020-09-16 07:13:11
回答 1查看 256关注 0票数 0

我是xamarin的新手,我需要轻松地将网格(或类似的东西)链接到我的MySql数据库表。在WinForms中,我通过在设计器中放置一个网格和几行代码来做到这一点,但是在Xamarin中,我什么也做不了……我当前的项目是一个带有默认“XamarinForm”预设的标签。

下面是WinForm代码:

代码语言:javascript
复制
        try
        {
            MySqlConnection cnn;
            string connetionString = "server=sql7.freesqldatabase.com;database=------;port=----;uid=-------;pwd=------;";
            cnn = new MySqlConnection(connetionString);

            DataTable dt = new DataTable();

            MySqlCommand cmd;
            cnn.Open();

            cmd = cnn.CreateCommand();
            cmd.CommandText = "SELECT * from Products";
            MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
            adapter.Fill(dt);
            dataGridView1.DataSource = dt; //dataGridView WinFrom component

            cnn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

有没有办法用Xamarin做到这一点?(我的目标是在一个页面中显示所有的db表)

EN

回答 1

Stack Overflow用户

发布于 2020-09-16 10:54:38

欢迎来到SO!

虽然没有Xamarin可以直接使用DataTable作为源的相同方法,但有另一种方法可以转换表数据并将其用于控件(如CollectionView、DataGrid等)。

例如,可以按如下方式设置ItemSource:

代码语言:javascript
复制
MyDataGrid.ItemsSource = await TodoItemDatabase.Database.Table<TodoItem>().ToListAsync();

这里的TodoItem是表数据的模型,您需要在Xamarin表单中手动创建它。然后,应用程序将根据模型样式将表数据转换为列表数据。

代码语言:javascript
复制
using SQLite;
public class TodoItem
{
    [PrimaryKey, AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public bool Done { get; set; }
}

关于在Xamarin中使用数据库,你可以参考this official document.And there a sample project作为参考。上面的代码TodoItemDatabase类也是基于这个示例的。

下面是TodoItemDatabase类:

代码语言:javascript
复制
public class TodoItemDatabase
{
    static readonly Lazy<SQLiteAsyncConnection> lazyInitializer = new Lazy<SQLiteAsyncConnection>(() =>
    {
        return new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
    });

    public static SQLiteAsyncConnection Database => lazyInitializer.Value;
    static bool initialized = false;

    public TodoItemDatabase()
    {
        InitializeAsync().SafeFireAndForget(false);
    }

    async Task InitializeAsync()
    {
        if (!initialized)
        {
            if (!Database.TableMappings.Any(m => m.MappedType.Name == typeof(TodoItem).Name))
            {
                await Database.CreateTablesAsync(CreateFlags.None, typeof(TodoItem)).ConfigureAwait(false);                    
            }
            initialized = true;
        }
    }

    public Task<List<TodoItem>> GetItemsAsync()
    {
        return Database.Table<TodoItem>().ToListAsync();
    }

    public Task<List<TodoItem>> GetItemsNotDoneAsync()
    {
        return Database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
    }

    public Task<TodoItem> GetItemAsync(int id)
    {
        return Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveItemAsync(TodoItem item)
    {
        if (item.ID != 0)
        {
            return Database.UpdateAsync(item);
        }
        else
        {
            return Database.InsertAsync(item);
        }
    }

    public Task<int> DeleteItemAsync(TodoItem item)
    {
        return Database.DeleteAsync(item);
    }
}

以及包含数据库名称和其他内容的常量类。

代码语言:javascript
复制
public static class Constants
{
    public const string DatabaseFilename = "TodoSQLite.db3";

    public const SQLite.SQLiteOpenFlags Flags =
        // open the database in read/write mode
        SQLite.SQLiteOpenFlags.ReadWrite |
        // create the database if it doesn't exist
        SQLite.SQLiteOpenFlags.Create |
        // enable multi-threaded database access
        SQLite.SQLiteOpenFlags.SharedCache;

    public static string DatabasePath
    {
        get
        {
            var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            return Path.Combine(basePath, DatabaseFilename);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63911028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档