一个实际的案例就是门诊的时候,医生用药的情况,除了选择其他内容外,主要的就是快速录入药品信息。我们平常去大一点 的医院看病,好像看到的多数操作都是这样。还有一种方式就是销售人员提供的报价单,从产品里面选择信息,然后修改下价格,这些场景都是很适合这样的操作的。下面是一个门诊的例子。
首先要为GridControl添加两个字段,设置好他们的显示Caption和FieldName即可,然后在我们需要弹出窗口的单元格对象中,选择它的ColumnEdit控件为SearchLookup控件即可,如下所示。
这个时候,它会生成一个repositoryItemSearchLookUpEdit1的控件,这个控件就是该单元格的内嵌编辑控件了,可以从中选择列表的值,我们设置这个列表的DisplayMember为Name(显示的字段内容),ValueMember为ID(保存的值字段),如下所示。
除了你要设置主窗体里面的GridControl运行添加列外,你还需要设置编辑控件里面的View中OpitonsView里面的NewItemRowPosition为Botton(默认为None),这一步很重要,否则无法出现一个新建的行给你录入数据的。
下面的代码就是响应数据变化的时候,设置相应单元格的值的例子。
private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
if (e.Column.FieldName == "ID")
{
string id = e.Value.ToString();
DataRow[] dr = dt.Select(string.Format("ID = '{0}'", id));
if(dr != null && dr.Length > 0)
{
DataRow row = dr[0];
string name = row["Name"].ToString();
gridView1.SetRowCellValue(e.RowHandle, "Name", name);
}
}
}
在实际应用中,我们在编辑一些历史数据的时候,不希望原来的记录被修改,但是可以增加新的记录,但是前面所有介绍的内容,没有能够解决这个问题,那么我们应该如何操作才能实现这个效果呢?
其实GridView对象里面有一个ShowingEditor的事件,用来判断是否显示单元格的编辑器的,这样我们对数据库已有记录进行控制,不让它在列表中显示编辑控件出来即可,具体代码如下所示。
this.gridView1.ShowingEditor +=
new CancelEventHandler(gridView1_ShowingEditor);//实际使用的代码
void gridView1_ShowingEditor(object sender, CancelEventArgs e)
{
object ID = this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, "ID");
if (ID != null && !string.IsNullOrEmpty(ID.ToString()))
{
e.Cancel = true;
}
}
在保持数据的时候,我们对历史数据就不用修改保持,只需要针对新增的内容即可,如何做到的呢?其实就是判定他的绑定值是否存在即可,如果有绑定值,那么就是历史的数据,没有就是新的,进行特殊操作即可,如下代码所示。
if (this.gridView1.
Rowcount > 0)
{
#region 提交用药记录明细
for (int i = 0; i < this.gridView1.Rowcount; i++)
{
//根据ID来判断是否新增的用药记录
object ID = this.gridView1.GetRowCellValue(i, "ID");
if (ID == null || string.IsNullOrEmpty(ID.ToString()))
{
//.........................
}
}
#endregion
}