XAF 如何从Excel复制多个单元格内容到GridView
2012年04月11日 ⁄ 综合 ⁄ 共 10998字 ⁄ 字号 小 中 大 ⁄ 评论关闭 how to paste some excel content to xtragrid? .相關資料 http://community.devexpress.com/forums/t/36684.aspx http://community.devexpress.com/forums/t/58611.aspx .調用方法: using System;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.Persistent.Base;
using DevExpress.ExpressApp.Win.Editors;
using DevExpress.XtraGrid.Views.Grid; namespace XafExpandExtendTest.Module
{
public partial class CopyPasteListViewController : ViewController
{
public CopyPasteListViewController()
{
InitializeComponent();
RegisterActions(components);
TargetViewType = ViewType.ListView;
} private void simpleAction1_Execute(object sender, SimpleActionExecuteEventArgs e)
{
ListView lv = View as ListView;
GridView gv = (lv.Editor as GridListEditor).GridView;
XtraGridHelper.GridViewClipboardPaste(gv);
}
}
} .實現代碼: using System;
using System.Collections.Generic;
using System.Windows.Forms;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.Controls;
namespace XafExpandExtendTest.Module
{
public class XtraGridHelper
{
private static string ClipboardText
{
get
{
string value = string.Empty;
IDataObject iData = Clipboard.GetDataObject();
if (iData != null)
{
if (iData.GetDataPresent(DataFormats.Text))
{
value = iData.GetData(DataFormats.Text) as string;
}
}
return value;
}
set
{
Clipboard.SetDataObject(value);
}
}
//private static string[] ClipboardTextLines
//{
// get
// {
// return XtraGridHelper.ClipboardText.Split(' ');
// }
//} public static void PasteTable(GridView gridView)
{
gridView.ClearSorting();
int originalFocusedVisibleColIndex = gridView.FocusedColumn.VisibleIndex;
string[] clipboardTextLines = XtraGridHelper.ClipboardTextLines; // paste data from clipboard into row cells
foreach (string line in clipboardTextLines)
{
if (line != string.Empty)
{
string[] lineFragments = line.Split('\t');
foreach (string lineFragment in lineFragments)
{
// 'paste' in new value
gridView.ShowEditor();
if (gridView.ActiveEditor != null)
{
gridView.ActiveEditor.Text = lineFragment.Trim();
gridView.CloseEditor();
} // move to next visible column if next visible column exists
if (gridView.FocusedColumn.VisibleIndex < gridView.VisibleColumns.Count - )
{
gridView.FocusedColumn = gridView.VisibleColumns[gridView.FocusedColumn.VisibleIndex + ];
}
else
{
break; //stop 'pasting' in focused row
}
}
// move to next row
if (gridView.FocusedRowHandle < gridView.RowCount - )
{
gridView.MoveNext();
gridView.FocusedColumn = gridView.VisibleColumns[originalFocusedVisibleColIndex];
}
else
{
break; //stop 'pasting' in the grid
}
}
}
} /*You might consider pointing to kb articles that have the same paste functionality;
* the article refrenced by Brendon adds rows when a paste action is invoked.
* The solution presented in this thread pastes values into existing cells, relative to the focused cell.
* And man do I hate when I see questions posted with no answers, like the one that started this thread.
* Here is an update to my solution above, it only accomidates the column and edit types in my grid...
*/
public static void GridViewClipboardPaste(GridView gridView)
{
gridView.ClearSorting();
int originalFocusedVisibleColIndex = gridView.FocusedColumn.VisibleIndex;
string[] clipboardTextLines = XtraGridHelper.ClipboardTextLines; gridView.BeginUpdate(); //lock grid for update
// paste data from clipboard into row cells
foreach (string line in clipboardTextLines)
{
if (line != string.Empty)
{
string[] lineFragments = line.Split('\t');
foreach (string lineFragment in lineFragments)
{
string clipboardString = lineFragment.Trim(); // 'paste' in new value
try
{
RepositoryItem edit = gridView.FocusedColumn.ColumnEdit;
if (edit != null)
{
switch (edit.EditorTypeName)
{
case "ImageComboBoxEdit":
RepositoryItemImageComboBox imageComboBoxEdit = (RepositoryItemImageComboBox)edit;
foreach (ImageComboBoxItem item in imageComboBoxEdit.Items)
{
if (item.Description.Equals(clipboardString))
{
gridView.SetRowCellValue(gridView.FocusedRowHandle, gridView.FocusedColumn, item.Value);
break;
}
}
break;
case "CheckEdit":
bool checkValue;
if (Boolean.TryParse(clipboardString, out checkValue))
{
gridView.SetRowCellValue(gridView.FocusedRowHandle, gridView.FocusedColumn, checkValue);
}
break;
}
}
else
{
object newValue = null;
switch (gridView.FocusedColumn.ColumnType.Name)
{
case "String":
newValue = clipboardString;
break;
case "Boolean":
newValue = Boolean.Parse(clipboardString);
break;
case "Int32":
newValue = Int32.Parse(clipboardString);
break;
}
gridView.SetRowCellValue(gridView.FocusedRowHandle, gridView.FocusedColumn, newValue);
}
}
catch (Exception ex)
{
//do nothing
} // move to next visible column if next visible column exists
if (gridView.FocusedColumn.VisibleIndex < gridView.VisibleColumns.Count - )
{
gridView.FocusedColumn = gridView.VisibleColumns[gridView.FocusedColumn.VisibleIndex + ];
}
else
{
break; //stop 'pasting' in focused row
}
}
// move to next row
if (gridView.FocusedRowHandle < gridView.RowCount - )
{
gridView.MoveNext();
gridView.FocusedColumn = gridView.VisibleColumns[originalFocusedVisibleColIndex];
}
else
{
break; //stop 'pasting' in the grid
}
}
}
gridView.EndUpdate(); //lock grid for update
}
////////////////////////////////////////////////////////////////////
private static string[] ClipboardTextLines
{
get
{
var clipboardText = ClipboardText;
if (clipboardText.Contains(Environment.NewLine))
{
return clipboardText.Trim().Replace(Environment.NewLine, "\n") .Split('\n');
// Replace CRLF with just CR then Split.
} return clipboardText.Split(' ');
}
} // And this is what I did to speed it up:
public static void PasteTable2(GridView gridView)
{
gridView.ClearSorting();
var clipboardTextLines = new List<string>(ClipboardTextLines);
// If we have too many rows trim the list.
if (gridView.RowCount < clipboardTextLines.Count)
clipboardTextLines = new List<string>(clipboardTextLines.GetRange(, gridView.RowCount));
var currentCol = gridView.FocusedColumn;
var numberOfColumnsThatCanBePastedTo = gridView.VisibleColumns.Count - currentCol.VisibleIndex;
var pasteList = new List<List<string>>();
foreach (var line in clipboardTextLines)
{
var rowValues = new List<string>(line.Split('\t'));
// Make sure we don't overshoot the columns
if(rowValues.Count > numberOfColumnsThatCanBePastedTo)
rowValues = new List<string>(rowValues.GetRange(, numberOfColumnsThatCanBePastedTo));
pasteList.Add(rowValues);
}
var currentRow = gridView.FocusedRowHandle;
for (int i = ; i < pasteList.Count; i++)
{
var pasteRow = currentRow + i;
for (int j = ; j < pasteList[i].Count; j++)
{
var pasteCol = currentCol.VisibleIndex + j;
gridView.SetRowCellValue(pasteRow, gridView.VisibleColumns[pasteCol], pasteList[i][j]);
}
}
}
}
}

XAF 如何从Excel复制多个单元格内容到GridView(收藏)的更多相关文章

  1. 使用poi导出Excel,并设定单元格内容类型,抛出异常

    本例子使用的是HSSF,为Excel2003提供处理方案. 设定为输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import o ...

  2. excel VBA把一个单元格内容按逗号拆分并依次替换到另一个单元格的括号里面(本题例子,把文本中的括号换成{答案}的格式,并按顺序填空)

    方法1:运用excel单元格拆分合并实现 思路:用VBA正则查询左侧括号个数,对右侧单元格逐一按逗号.顿号等符号分列,同时左侧按括号分列(分列只能按括号单边分列),分列完成后按要求合并,本题事例把括号 ...

  3. excel用函数去掉单元格内容中的括号,并只保留单元格里面的内容

    1.substitute(需要执行替换操作的单元格,需要替换的字符,替换后的字符,有多个需要替换的字符可以指定替换的第几个) 例如:aab--substitute("aab",&q ...

  4. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  5. 读取Excel文件中的单元格的内容和颜色

    怎样读取Excel文件中的单元格的内容和颜色 先创建一个Excel文件,在A1和A2中随意输入内容,设置A1的字体颜色为红色,A2的背景为黄色.需要 using Excel = Microsoft.O ...

  6. Excel单元格内容太多会覆盖遮住下一单元格范围

    Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设 ...

  7. poi 升级至4.x 的问题总结(POI Excel 单元格内容类型判断并取值)

    POI Excel 单元格内容类型判断并取值 以前用 cell.getCachedFormulaResultType() 得到 type 升级到4后获取不到了 换为:cell.getCellType( ...

  8. Excel表格如何保护单元格不被修改

    Excel如何保护单元格不被修改  有时使用Excel时希望保护单元格不被修改,这可以叫做单元格的“写保护”即把光标定位在一个不允许输入数据的区域内时,是无论如何也无法在里面输入数据的.下面咱们就一起 ...

  9. excel 单元格内容太多,替换有问题

    excel 单元格内容太多,替换有问题

随机推荐

  1. CentOS6.4下Docker应用环境的部署配置

    http://blog.chinaunix.net/uid-619485-id-4973941.html *********************************************** ...

  2. Mac命令行启动MySQL

    #mysql 启动 mysql.server start #mysql停止 mysql.server stop #mysql重启 mysql.server restart

  3. 用log4j将日志写入数据库

    以下为log4j中的配置参数: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %t 输出产 ...

  4. jfinal中Interceptor的使用

    一.拦截器是用于对action请求的拦截处理,发生在进入action方法体之前的拦截操作,这样方便了对请求实例做一些文章.   二.自定义.系统已有拦截器都需要实现Interceptor接口,这样才能 ...

  5. 基于HTML5自定义文字背景生成QQ签名档

    分享一款利用HTML5实现的自定义文字背景应用,首先我们可以输入需要显示的文字,并且为该文字选择一张背景图片,背景图片就像蒙版一样覆盖在文字上.点击生成QQ签名档即可将文字背景融为一体生成另外一张图片 ...

  6. 一款纯css3实现的超炫3D表单

    今天要给大家分享一款纯css3实现的超炫3D表单.该特效页面的加载的时候3d四十五度倾斜,当鼠标经过的时候表单动画回正.效果非常炫,一起看下效果图: 在线预览   源码下载 实现的代码. html代码 ...

  7. VIM打开shell脚本中文乱码解决

    1. 查找 .vimrc文件 通常有2个地方保存这个文件的: (1) 在/etc/文件夹下面,是所有用户的vim配置 (2)每个用户的开始登录的文件夹下面,有些不一定有,比如hadoop用户,则在/h ...

  8. 解决Error:Android Dex: com.android.dex.DexIndexOverflowException: Cannot merge new index 65918 into a

    错误:Error:Android Dex: com.android.dex.DexIndexOverflowException: Cannot merge new index 65918 into a ...

  9. VMware ESXi vsan.v00卡 停

    重装VMware ESXi 6.5,结果在loading vsan.v00文件的时候卡住了,过了几个小时都停留在这个界面.无意间重启使用UEFI 启动,提示某文件校验出错,MD5对不上,重新写入安装镜 ...

  10. HashMap与HashCode有关,用Sort对象排序

    遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值. 上面这个算法的关键语句: Set s=m.keySet(); I ...