C# 在Xamarin中有没有一种方法可以像在我的WinForms代码中那样轻松地将网格绑定到表?
我是xamarin的新手,我需要轻松地将网格(或类似的东西)链接到我的MySql数据库表。 在WinForms中,我用设计器和几行代码放置了一个网格,但是用Xamarin我什么都做不了。。。 我当前的项目是一个带有默认“tab”预设的表单 以下是WinForm代码: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
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);
}
}
}