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. jquery 获取各种高宽

    获取浏览器显示区域(可视区域)的高度 :   $(window).height();   获取浏览器显示区域(可视区域)的宽度 : $(window).width();   获取页面的文档高度   $ ...

  2. lua工具库penlight--04路径和目录

    使用路径 程序不应该依赖于奇葩的系统,这样你的代码会难以阅读和移植.最糟糕的是硬编码的路径, windows和Unix的路径分隔符正好相反.最好使用path.join,它可以帮助你解决这个问题. pl ...

  3. 浏览器中F5和CTRL F5的行为区别

    前言 在印象中,浏览器中的F5和刷新按钮是一样的效果,都是对当前页面进行刷新:Ctrl-F5的行为也是刷新页面,但是会清除浏览器缓存,这在前端调试时候会常用.二者真正的区别是什么呢?在stackove ...

  4. PHP,JavaScript,CSS三种HTML内嵌语言的语法,变量,循环,函数记录

    PHP PHP简介: PHP 是服务器端脚本语言. PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言. PH ...

  5. CSS(二):选择器

    一.基本选择器 1.标签选择器 HTML标签作为标签选择器的名称,例如<h1>~<h6>.<p>等. 语法: p{font-size: 16px;} p:标签选择器 ...

  6. WebIM技术---编写前端WebSocket组件

    过去我们想要实现一个实时Web应用通常会考虑采用ajax轮循或者是long polling技术,但是因为频繁的建立http连接会带来多余的请求以及消息精准性的问题,让我们在实现实时Web应用时头疼不已 ...

  7. 第二百六十五节,xss脚本攻击介绍

    xss脚本攻击介绍 Cross-Site Scripting(XSS)是一类出现在 web 应用程序上的安全弱点,攻击者可以通过 XSS 插入一 些代码,使得访问页面的其他用户都可以看到,XSS 通常 ...

  8. 多媒体开发之视频回放---dm642 做rtsp 视频回放功能

    之前看过一款海康的视频录制和回放的ipnc 四路就是: 录制还是在本地电脑录制,通过插件在本地生成录制视频和snap图片, 回放估计就是按时间点生成的文件调用本地播放. http://m.blog.c ...

  9. 【BZOJ】1057: [ZJOI2007]棋盘制作(单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1057 同某一题差不多?记不清是哪题了.. 就是每一行进行单调栈维护递增的高度,在进栈和出栈维护一下长 ...

  10. 【BZOJ】3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合+乘法逆元+欧拉定理/费马小定理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3398 以下牡牛为a,牝牛为b. 学完排列计数后试着来写这题,“至少”一词可以给我们提示,我们可以枚举 ...