请教如何将Xamarin DataGridView选中行值传递至另一页面TextBox
Xamarin DataGridView选中行值传递至另一页面TextBox的解决方案
一、基于现有DataTable绑定的修改方案
你的代码已通过DoubleTap事件获取选中行,可简化参数传递逻辑,直接提取字段值传递给目标页面:
1. 修改双击事件代码,提取选中行字段值
private void DataGridView_DoubleTap(object sender, DataGridGestureEventArgs e) { if (e.Item is DataRowView selectedRow) { // 提取字段值(注意对应数据库原字段名,而非查询别名) string roomNo = selectedRow["Room_No"].ToString(); string roomStatus = selectedRow["Room_Status"].ToString(); string startTime = selectedRow["S_Time"].ToString(); string endTime = selectedRow["E_Time"].ToString(); string createDate = selectedRow["c_date"].ToString(); // 传递参数并跳转至编辑页面 var editForm = new EditFormPage(roomNo, roomStatus, startTime, endTime, createDate); Navigation.PushAsync(editForm); } }
2. 修改EditFormPage构造函数,接收参数并赋值给TextBox
public partial class EditFormPage : ContentPage { public EditFormPage(string roomNo, string roomStatus, string startTime, string endTime, string createDate) { InitializeComponent(); // 假设页面TextBox控件名称为txtRoomNo、txtRoomStatus等 txtRoomNo.Text = roomNo; txtRoomStatus.Text = roomStatus; txtStartTime.Text = startTime; txtEndTime.Text = endTime; txtCreateDate.Text = createDate; } }
二、更灵活的整行数据传递方案
若需后续扩展字段,可直接传递整个选中行对象:
1. 修改双击事件代码
private void DataGridView_DoubleTap(object sender, DataGridGestureEventArgs e) { if (e.Item is DataRowView selectedRow) { var editForm = new EditFormPage(selectedRow); Navigation.PushAsync(editForm); } }
2. 修改EditFormPage构造函数
public partial class EditFormPage : ContentPage { public EditFormPage(DataRowView selectedRow) { InitializeComponent(); txtRoomNo.Text = selectedRow["Room_No"].ToString(); txtRoomStatus.Text = selectedRow["Room_Status"].ToString(); txtStartTime.Text = selectedRow["S_Time"].ToString(); txtEndTime.Text = selectedRow["E_Time"].ToString(); txtCreateDate.Text = selectedRow["c_date"].ToString(); } }
三、推荐:强类型实体类优化绑定与传递
直接用DataTable绑定不够直观,建议定义实体类转换数据,提升代码可读性与维护性:
1. 定义HK_Chk实体类
public class HK_Chk { public string Room_No { get; set; } public string Room_Status { get; set; } public DateTime S_Time { get; set; } public DateTime E_Time { get; set; } public DateTime c_date { get; set; } }
2. 修改数据填充代码
private void Bind_GVhkCL(string text) { string query = "SELECT Room_No,Room_Status,S_Time,E_Time,c_date from HK_Chk " + text; sqlConnection.Open(); SqlDataAdapter da = new SqlDataAdapter(query, sqlConnection); DataTable dt = new DataTable(); da.Fill(dt); // 转换为强类型列表 List<HK_Chk> hkList = new List<HK_Chk>(); foreach(DataRow row in dt.Rows) { hkList.Add(new HK_Chk { Room_No = row["Room_No"].ToString(), Room_Status = row["Room_Status"].ToString(), S_Time = Convert.ToDateTime(row["S_Time"]), E_Time = Convert.ToDateTime(row["E_Time"]), c_date = Convert.ToDateTime(row["c_date"]) }); } GVhkCL.ItemsSource = hkList; sqlConnection.Close(); }
3. 修改双击事件与编辑页面
// 双击事件 private void DataGridView_DoubleTap(object sender, DataGridGestureEventArgs e) { if (e.Item is HK_Chk selectedItem) { var editForm = new EditFormPage(selectedItem); Navigation.PushAsync(editForm); } } // EditFormPage构造函数 public partial class EditFormPage : ContentPage { public EditFormPage(HK_Chk selectedItem) { InitializeComponent(); txtRoomNo.Text = selectedItem.Room_No; txtRoomStatus.Text = selectedItem.Room_Status; txtStartTime.Text = selectedItem.S_Time.ToString("yyyy-MM-dd HH:mm"); txtEndTime.Text = selectedItem.E_Time.ToString("yyyy-MM-dd HH:mm"); txtCreateDate.Text = selectedItem.c_date.ToString("yyyy-MM-dd"); } }
内容的提问来源于stack exchange,提问作者Nadeem Ahmed
相关产品推荐
相关产品推荐

