我正在使用 C# Winforms 和实体框架,我的项目基于此链接建模:与 WinForms 的数据绑定 https://msdn.microsoft.com/en-us/data/jj682076.aspx
我的问题是如何转换DataGridView
or a BindingSource
to a DataTable
?
我尝试了这段代码:
DataTable data = (DataTable)(DataGridView1.DataSource);
但失败并出现错误:
无法将“System.Windows.Forms.BindingSource”类型的对象强制转换为“System.Data.DataTable”类型。
然后我尝试了这个代码:
BindingSource bs = (BindingSource)DataGridView1.DataSource;
DataTable dt = (DataTable)bs.DataSource;
但这最终会导致另一个错误:
无法将类型“System.Data.Entity.Internal.DbLocalView`1[Project1.Contexts.table1]”的对象转换为类型“System.Data.DataTable”。
尝试在其他网站上搜索其他类似的问题,但找不到转换的方法System.Data.Entity.Internal.DbLocalView
to DataTable
.
Edit:
这是我的代码和要求。
要求:
我有 2 份表格,第 1 份表格有DataGridView
named enrollmedsDataGridView
哪个数据绑定到enrollmedsBindingSource
. enrollmedsBindingSource.DataSource
被设定为m3d.enrollmeds.Local
(m3d
是我的上下文)。窗口有文本框ItemRemarks
(每个所选项目的备注),一个按钮Save
保存列表和按钮Add
这将打开第二个表格,用于选择项目主列表上的项目。
要将第二个表单上的选定项目转移到第一个表单上,我将DataGridView
to DataTable
然后清除BindingSource
第一种形式并将所选项目重新添加到BindingSource
我想要的是有一种方法让第二个表单知道已经选择了哪些项目,以便能够设置默认选择的项目(当前第二个表单默认是所有项目都未选中)
第一种形式的代码 (EnrollMedicationFrm)
:
M3dEntities m3d = new M3dEntities();
enrollmeds _enrollmeds;
EnrollMedSelectionFrm enrollselectfrm;
public DataTable SelectedItems { get; set; }
public string SelectedAdmNo { get; set; }
private void EnrollMedicationFrm_Load(object sender, EventArgs e)
{
var _SelectedPKAdm = (from p in m3d.admission
where p.admissionNo == SelectedAdmNo
select p.PK_Admission).FirstOrDefault();
int _selectedAdmno = int.Parse(SelectedAdmNo);
m3d.enrollmeds.Where(adm => adm.FK_Admission == _SelectedPKAdm).ToList();
this.enrollmedsBindingSource.DataSource = m3d.enrollmeds.Local;
}
private void AddBtn_Click(object sender, EventArgs e)
{
enrollselectfrm = new EnrollMedSelectionFrm();
var pxdetails = (from adm in m3d.admission
join pxDC in m3d.datacenter
on adm.FK_DC_Patient equals pxDC.PK_Datacenter
where adm.admissionNo == SelectedAdmNo
select new
{
adm,
pxDC
}).FirstOrDefault();
if (enrollselectfrm.ShowDialog() == DialogResult.OK)
{
if (SelectedItems == null)
{
enrollmedsBindingSource.Clear();
}
else
{
enrollmedsBindingSource.Clear();
foreach (DataRow dr in SelectedItems.Rows)
{
_enrollmeds = new enrollmeds();
_enrollmeds.FK_DC_Patient = pxdetails.pxDC.PK_Datacenter;
_enrollmeds.FK_DC_userAdd = mainfrm.PK_DC_UserLoggedIn;
var svrDT = ((IObjectContextAdapter)m3d).ObjectContext.CreateQuery<DateTime>("CurrentDateTime() ");
DateTime currdatetime = svrDT.AsEnumerable().First();
_enrollmeds.AddDateTime = currdatetime;
_enrollmeds.FK_Admission = pxdetails.adm.PK_Admission;
_enrollmeds.Qty = 0;
int pkItems = int.Parse(dr.Field<string>("PK_Items").ToString());
var itemdtls = (from i in m3d.items
where i.PK_Items == pkItems
select i).FirstOrDefault();
_enrollmeds.FK_Items = pkItems;
_enrollmeds.ItemRemarks = itemdtls.ItemRemarks;
enrollmedsBindingSource.Add(_enrollmeds);
}
}
}
}
第二种形式的代码 (EnrollMedSelectionFrm)
:
M3dEntities m3d = new M3dEntities();
private void EnrollMedSelectionFrm_Load(object sender, EventArgs e)
{
var items = from i in m3d.items
where i.ItemGroup == "Medicine"
select new
{
i.PK_Items,
i.ItemID,
i.ItemDesc,
i.GenericName
};
if (items != null)
{
DataTable dt = new DataTable();
foreach (DataGridViewColumn col in ItemSelectionDataGridView.Columns)
{
dt.Columns.Add(col.Name);
col.DataPropertyName = col.Name;
};
foreach (var element in items)
{
var row = dt.NewRow();
row["PK_Items"] = element.PK_Items;
row["ItemID"] = element.ItemID;
row["ItemDesc"] = element.ItemDesc;
row["GenericName"] = element.GenericName;
dt.Rows.Add(row);
}
ItemSelectionDataGridView.DataSource = dt;
}
}
private void SelectBtn_Click(object sender, EventArgs e)
{
EnrollMedicationFrm enrollfrm = (EnrollMedicationFrm)Application.OpenForms["EnrollMedicationFrm"];
DataTable dt = new DataTable();
dt = (DataTable)ItemSelectionDataGridView.DataSource;
DataRow[] result = dt.Select("SelectedChkBox = 1");
if (result.Count() < 1)
{
enrollfrm.SelectedItems = null;
}
else
{
enrollfrm.SelectedItems = result.CopyToDataTable();
}
this.DialogResult = DialogResult.OK;
}
我用这个流程进行了很多表单验证,但它们都有这个问题:(
一旦这个问题得到解决,我认为所有或大部分问题也可以得到解决
请指导我如何解决这个问题,其他方法甚至解决方法可能会很有帮助,提前非常感谢:)