我是xamarin的新手,我需要轻松地将网格(或类似的东西)链接到我的MySql数据库表。在WinForms中,我通过在设计器中放置一个网格和几行代码来做到这一点,但是在Xamarin中,我什么也做不了……我当前的项目是一个带有默认“XamarinForm”预设的标签。
下面是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表)
发布于 2020-09-16 10:54:38
欢迎来到SO!
虽然没有Xamarin可以直接使用DataTable作为源的相同方法,但有另一种方法可以转换表数据并将其用于控件(如CollectionView、DataGrid等)。
例如,可以按如下方式设置ItemSource:
MyDataGrid.ItemsSource = await TodoItemDatabase.Database.Table<TodoItem>().ToListAsync();这里的TodoItem是表数据的模型,您需要在Xamarin表单中手动创建它。然后,应用程序将根据模型样式将表数据转换为列表数据。
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类:
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);
}
}
}https://stackoverflow.com/questions/63911028
复制相似问题