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. 出现“unrecognized selector sent to instance”问题原因之一及解决方法。

      ​ 对于iPhone开发初学者来说,很想实现自己在iPhone上的第一个小程序,准备工作就绪侯就信心满满的开始了!一般来说大家可能都是从Hello World做起吧. 反正我是的,:),如果按照文 ...

  2. linux 无外网情况下安装 mysql

    由于工作需要,需要在一台装有 CentOS 系统的测试服务器上安装 MySQL ,由于该服务器上存有其他比较重要的测试数据,所以不能连接外网.由于之前安装 MySQL 一直都是使用 yum 命令一键搞 ...

  3. saveFile()方法

    saveFile的原理就是将流写入到需要写入的文件,通过可以用“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:public vo ...

  4. 记一次线上MySQL数据库死锁问题

            最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...

  5. Linux系统查看公网IP地址

    curl members.3322.org/dyndns/getip

  6. MySQL5.0、5.1、5.5、5.6功能进化

    目前线上使用的版本情况:新上线端口统一使用5.5,不说别的,一个快速恢复重启就值回票价. 但因为历史原因还有大量5.1的版本,甚至,I’am sorry,还有少数5.0的版本. 至于5.0以前的版本, ...

  7. Android应用双击返回键退出

    @Override public void onBackPressed() { // TODO 退出提示 if (System.currentTimeMillis() - mExitTime > ...

  8. 欧拉函数 & 【POJ】2478 Farey Sequence & 【HDU】2824 The Euler function

    http://poj.org/problem?id=2478 http://acm.hdu.edu.cn/showproblem.php?pid=2824 欧拉函数模板裸题,有两种方法求出所有的欧拉函 ...

  9. Maven中将所有依赖的jar包全部导出到文件夹

    因为我要对Java类的功能在生产环境(服务器端)进行测试,所以需要将jar包导出,然后在服务器端用-Djava.ext.dirs=./lib的方式走一遍, 下面是解决方案: 在pom.xml中加入如下 ...

  10. 【ML】有偏样本解决方案

    占个位置,得空写文章. From:learning-from-imbalanced-data