栏目搜索
 
 
 
 
你的位置:首页 > 移动开发 > 移动程序中使用DataGrid控件 >
 

移动程序中使用DataGrid控件

发布者:[本站编辑] | 来源:[]

移动程序中使用DataGrid控件_电脑维修资料库



  摘要:学习如何在你的pocket pc应用程序中如何有效地使用datagrid控件进行数据查看和更新。
  table data

  在实现企业级pocket pc应用程序时,几乎总是需要以表格的方式浏览数据。大多数通用的方案是你输入许多查找标准,得到作为一个表的查找结果集,并从中搜索或选择。一个表格是一个非常直接的显示数据的途径,可以被你直接使用与屏幕空间中。

  the datagrid control

  包括在microsoft? visual studio? .net 2003中的datagrid控件是一个强大的控件,使你能够以多种方式查看数据。这个控件可以被绑定到一个datatable,dataview,arraylist或者任何其他支持ilistsource或者ilist接口的对象中。

  让我们来看datagrid控件是如何被用于一个pocket pc应用程序实例的。

  datagrid sample

  这个pocket pc的应用程序实例使用visual studio .net 2003, c#, 和 microsoft .net compact framework 创建。它将演示如何使用datagrid控件查看并更新数据。这个程序由一个form组成:


figure 1. datagrid sample

  这个实例开始时载入订单表(一个来自northwind sample database的原始订单表的子集)到一个grid中,然后使用多种column style来创建一个好看的界面。点击column header可以对每一个column进行排序,再点击排序后的column header可以在升序和降序间切换。

  一个非常好的功能是grid中的每一个cell都是可编辑的。当一个cell被点击并获得输入焦点时,cell中的值可以被更新(见图一)。当其他cell被选择时,被编辑过的cell被更新,新的cell变为可编辑。注意,当一个cell得到输入焦点,软键盘(sip)是被自动激活(弹出)。一个可能的增进是例子可以拖动被选择的cell到可见,当它被sip覆盖的时候。

  现在,让我们看一下代码是如何实现的。



  code walkthrough

  在实例代码中,datagrid控件被命名为grdorders。将订单表(被存成xml文件)加载到datagrid控件,你只需要下面的代码:

dataset ds = new dataset();
ds.readxml(@\\program files\\dgrid\\orders.xml);
grdorders.datasource = ds.tables<0>;
  事实上,如果你只做了这些,那么将得到一个非常简单的grid,每个column header上将会显示表字段的名字。为了让grid看上去更好,使用table styles。一个table style可以包含多种table styles——你想在grid中查看每个column。在这个例子中,columns包括订购信息和收货人姓名。下面的代码设置状态:

datagridtablestyle ts = new datagridtablestyle();
ts.mappingname = order;

// order date column style
datagridcolumnstyle orderdate = new datagridtextboxcolumn();
orderdate.mappingname = orderdate;
orderdate.headertext = date;
ts.gridcolumnstyles.add(orderdate);

// shipping name column style
datagridcolumnstyle shipname = new datagridtextboxcolumn();
shipname.mappingname = shipname;
shipname.headertext = customer;
shipname.width = this.width - orderdate.width - 37;
ts.gridcolumnstyles.add(shipname);

grdorders.tablestyles.add(ts);

  每个column style(datagridcolumnstyle)设置一个表字段名称映射到(mappingname property),header text用于显示(headertext property),并自定义column宽度(width property)。两个column styles被加入到table style中,最后将table style加入到datagrid控件(grdorders)中。在这个例子里styles是被代码创建的,但是styles同样可以在forms designer中被创建。

  当这个grid看上去很好时,有许多common features在grid中可以被支持。编辑就是其中之一。但编辑在datagrid控件中不是被自动支持的,这就需要手工实现。一种方法就是使用一个隐藏的textbox控件,当一个cell被选中时显示,当编辑结束时隐藏。这就需要你声明一些变量:

private datagridcell editcell;
private bool ineditmode = false;
private bool inupdatemode = false;
  我们需要获取哪个cell被编辑激活(editcell),这个cell是否在编辑状态(ineditmode),和我们是否正在更新一个cell(inupdatemode).

  控制编辑代码如下:

private void grdorders_currentcellchanged(object sender,system.eventargs e)
{
 if (!inupdatemode)
 {
  if (ineditmode && !grdorders.currentcell.equals(editcell))
  {
   // update edited cell
   inupdatemode = true;
   grdorders.visible = false;
   datagridcell currentcell = grdorders.currentcell;
   grdorders =
   txtedit.text;
   grdorders.currentcell = currentcell;
   grdorders.visible = true;
   inupdatemode = false;
   txtedit.visible = false;
   ineditmode = false;
  }

  // enter edit mode
  editcell = grdorders.currentcell;
  txtedit.text = (string)grdorders  editcell.columnnumber>;
  rectangle cellpos = grdorders.getcellbounds(editcell.rownumber,
  editcell.columnnumber);
  txtedit.left = cellpos.left - 1;
  txtedit.top = cellpos.top + grdorders.top - 1;
  txtedit.width = cellpos.width + 2;
  txtedit.height = cellpos.height + 2;
  txtedit.visible = true;
  ineditmode = true;
 }
}
  当一个cell被点击(ineditmode和inupdate被设置为false)时,当前的cell被保存(editcell)。然后,隐藏的textbox(txtedit)得到当前cell的内容,重新设置到当前cell的位置,并使其可见(在当前的cell上边)。当编辑完成、其他cell被选择时,事件代码不可用(inupdatemode设置成true),当被编辑的cell从textbox控件得到后,将新的cell保存(currentcell)。在update过程中,grid没有被update(visible设置成false),当update完成textbox被重新隐藏。

  其他的common grid feature是通过点击column header进行排序。代码如下:

private void grdorders_mouseup(object sender,
system.windows.forms.mouseeventargs e)
{
 datagrid.hittestinfo hittest = grdorders.hittest(e.x, e.y);
 if (hittest.type == datagrid.hittesttype.columnheader)
 {
  // exit edit mode
  txtedit.visible = false;
  ineditmode = false;

  // sort tapped column
  datatable datatable = (datatable)grdorders.datasource;
  dataview dataview = datatable.defaultview;
  string columnname = datatable.columns.columnname;
  if (dataview.sort == columnname)
   dataview.sort = columnname + desc;
  else
   dataview.sort = columnname;
 }
}
  如果header被点击,第一件事是确保任何当前cell的编辑被取消。然后一个dataview被创建并通过点击的column排序。如果一个column再次得到点击事件而排序顺序将被改成递减。后来的点击将使排序在递增和递减间切换,直到其他的column被点击。

  结论

  datagrid控件是一个查看(然后是编辑)数据的强大工具,用于你的pocket pc应用程序。这个控件提供多样性的features,而且这篇文章包含一些有趣的特性:数据绑定,grid内编辑,排序。你的下一步是在这个例子上做一些深层次的开发,探索这个控件中更多更cool的窍门。

</t