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

C# 在Xamarin中有没有一种方法可以像在我的WinForms代码中那样轻松地将网格绑定到表?,c#,mysql,xamarin,xamarin.forms,C#,Mysql,Xamarin,Xamarin.forms,我是xamarin的新手,我需要轻松地将网格(或类似的东西)链接到我的MySql数据库表。 在WinForms中,我用设计器和几行代码放置了一个网格,但是用Xamarin我什么都做不了。。。 我当前的项目是一个带有默认“tab”预设的表单 以下是WinForm代码: try { MySqlConnection cnn; string connetionString = "server=sql7.freesq

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

以下是WinForm代码:

        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表)

欢迎使用SO

虽然Xamarin可以直接使用
数据表
作为源代码的方法与Xamarin不一样,但是还有另一种方法可以转换表日期并将其用于控制(例如
CollectionView
DataGrid
等)

例如,ItemSource可以设置如下:

MyDataGrid.ItemsSource = await TodoItemDatabase.Database.Table<TodoItem>().ToListAsync();
关于在Xamarin中使用数据库,您可以参考。还有供参考的。上述代码TodoItemDatabase类也基于此示例

以下是TodoItemDatabase类:

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);
    }
}

您需要一个DataGrid控件。XF并没有一个内置的,但有几种商业和开源的替代方案可用。你们可以试试collectionview。好的,我已经添加了一个网格(Xamarin.Forms.DataGrid),但如何将它和我的代码绑定在一起呢?好的,我已经创建了一个包含所有变量(如Id、名称等)的类,但是下一步是什么?@Jolink next您需要生成一个数据库实例,然后可以按照上面的代码获取表数据:
TodoItemDatabase.database.table().ToListAsync()
。看看共享的示例项目。我现在在回答中也更新了它。
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);
    }
}
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);
        }
    }
}