09
2019
01

c# word 操作系列之Selection 对象

Selection对象代表当前选择的area。在word应用程序中,假如你要让一段字符变成黑体,你必须首先选择该段文字,然后应用样式。在代码中也是同样的道理,你要首先定义selection的区域然后进行操作。你可以使用Selection对象在文档中进行选择,格式化,操作,添加文本等。

Selection对象是始终存在的,如果当前没有选择任何东西,那么它代表一个insertion point。因此,在操作Seleciton之前知道它包含的内容是非常重要的。

Tips:    Selection对象与Range对象有很多成员是类似的,它们之间的区别是Selection对象指的是现实在图形界面的区域,而Range对象代表的区域是不可见的(当然通过调用方法可以使其可见)

Selection的类型有很多。比如,你要对一张表格的一列进行操作,你应该确保该列已经selected,否则会出现运行时错误。

可以通过Selection对象的 Type属性获取你需要的信息,Type属性包含一个WdSelectionType的枚举类型成员。它有如下几个值:

  • wdSelectionBlock

  • wdSelectionColumn

  • wdSelectionFrame

  • wdSelectionInlineShape   表示一幅图片

  • wdSelectionIP                    表示插入点(insertion point)

  • wdSelectionNormal          表示选中的文本或者文本和其他对象的组合

  • wdNoSelection

  • wdSelectionRow

  • wdSelectionShape

下面是Type属性的应用例子

// C#
public void ShowSelectionType() 
{
    string  str;
    switch (ThisApplication.Selection.Type) 
    {
        case Word.WdSelectionType.wdSelectionBlock:
            str = "block";
            break;
        case Word.WdSelectionType.wdSelectionColumn:
            str = "column";
            break;
        case Word.WdSelectionType.wdSelectionFrame:
            str = "frame";
            break;
        case Word.WdSelectionType.wdSelectionInlineShape:
            str = "inline shape";
            break;
        case Word.WdSelectionType.wdSelectionIP:
            str = "insertion point";
            break;
        case Word.WdSelectionType.wdSelectionNormal:
            str = "normal text";
            break;
        case Word.WdSelectionType.wdNoSelection:
            str = "no selection";
            break;
        case Word.WdSelectionType.wdSelectionRow:
            str = "row";
            break;
        default:
            str = "(unknown)";
            break;
    }
    MessageBox.Show(str, "ShowSelectionType");
}

1.2      Navigating and Selecting Text

为了判断什么被选中了,你也可以采用下面的方法。 

1.2.1  Home and End Key Method

在使用Word时,我们知道,按下键盘的HOME键将使光标移动到光标所在行的行首,按下END键将使光标移动到行尾。在代码中,可以使用模拟按键的方法将改变selection。请看下面两个函数:

HomeKey( [Unit] , [Extend] ) : 模拟按下HOME键

EndKey( [Unit] , [Extend] )   :模拟按下END键

上面的两个函数中,参数Unit有一下可选值(wdUnit类型):

l  Wdline        移动到一行的开始或结束位置(缺省值)

l  WdStory      移动到文档的开始或结束位置

l  WdColumn  移动到一列的开始或结束位置(仅针对表格)

l  WdRow       移动到一行的开始或结束位置(仅正对表格)

参数Extend的可选值(WdMovementType类型):

l  WdMove     移动selection

l  WdExtend   扩展selection。举例说明:考虑一个场景,当前选择了一行,然后调用HomeKey方法,传入参数wdStory以及wdExtend,那么该行将不被包含在新selection对象中,同样的情况如果调用EndKey方法,那么该行将会包含在新selection对象中。 

下面的示例代码演示了:移动insertion point到文档开始出,然后使用EndKey方法选中整个文档:


// C#// Position the insertion point at the beginning // of the document.Object unit     = Word.WdUnits.wdStory;Object extend   = Word.WdMovementType.wdMove;ThisApplication.Selection.HomeKey(ref unit, ref extend);// Select from the insertion point to the end of the document.unit    = Word.WdUnits.wdStory;extend  = Word.WdMovementType.wdExtend;ThisApplication.Selection.EndKey(ref unit, ref extend);

 1.2.2  Arrow Key Method

既然可以模拟HOME,END键,那么当然也可以模拟按下方向键。Word提供如下四个方法,其中Count参数代表移动多少个Unit。

  • MoveLeft([Unit], [Count], [Extend])

  • MoveRight([Unit], [Count], [Extend])

  • MoveUp([Unit], [Count], [Extend])

  • MoveDown([Unit], [Count], [Extend])

其中,Extend参数使用的是与END,HOME相同的枚举类型变量,它包含两个可选值:wdMove,wdExtend.

而移动单元(Unit)类型与前面的有所不同,而且针对左右移动和上下移动有所区分。

  • 左右移动时对应的单元类型  MoveLeft() MoveRight()

  • wdCharacter: 字符(缺省)

  • wdWord: 单词

  • wdCell: 单元格(仅对表格)

  • wdSentence: 句子

下面的代码演示了:向左移动插入点三个字符,然后选择插入点右边的三个单词

// C#// Move the insertion point left 3 characters.Object unit = Word.WdUnits.wdCharacter;Object count = 3;Object extend = Word.WdMovementType.wdMove;ThisApplication.Selection.MoveLeft(ref unit, ref count,ref extend);// Select the 3 words to the right of the insertion point.unit = Word.WdUnits.wdWord;count = 3;extend = Word.WdMovementType.wdExtend;ThisApplication.Selection.MoveRight(ref unit, ref count,ref extend);
  • 上下移动时对应的单元类型 MoveUp() MoveDown()

  • wdLine            :行 (缺省)

  • wdParagraph  :段落

  • wdWindow           :窗口

  • wdScreen        :屏幕大小

下面的例子演示了使用上述方法先把插入点向上移动一行,然后选择其后的三个段落。

// C#// Move the insertion point up one line.Object unit = Word.WdUnits.wdLine;Object count = 1;Object extend = Word.WdMovementType.wdMove;ThisApplication.Selection.MoveUp(ref unit, ref count, ref extend);// Select the following 3 paragraphs.unit = Word.WdUnits.wdParagraph;count = 3;extend = Word.WdMovementType.wdMove;ThisApplication.Selection.MoveDown(ref unit, ref count,ref extend);

3.2.3 Move Method

使用Move方法将改变指定的range或者selection。

下面的例子将使插入点移动到第三个单词之前

// Use the Move method to move 3 words.Obiect unit = Word.WdUnits.wdWord;Object count = 3;ThisApplication.Selection.Move(ref unit, ref count);

3.2.4  Inserting Text

最简单的在文档中插入文本的方法是使用Selection对象的TypeText方法。TypeText方法的行为由用户的选择决定。下面这个例子就使用了一个叫做    overtype 的选项。该选项如果被打开,那么插入字符将导致插入点后面的文本被覆盖。----------------------------------------------------------------------------

重要的例子  演示如何插入文本(若selection类型不是insertion point或者 a block of text ,那么下面的代码do nothing)
 
public void InsertTextAtSelection() 
{
  Word.Selection sln = ThisApplication.Selection;
 
  // Make sure overtype is turned off.
  ThisApplication.Options.Overtype = false;
 
//当前的selection对象是否为插入点
//如果是,那么插入一段字符,然后插入段标记
if (sln.Type == Word.WdSelectionType.wdSelectionIP ) 
{
    sln.TypeText("Inserting at insertion point. ");
    sln.TypeParagraph();//插入paragraph mark
}
 
//selection对象是否为normal 类型
  else if (sln.Type == Word.WdSelectionType.wdSelectionNormal ) 
  {
        // 查看ReplaceSelection选项是否开启
//如果开启,那么摧毁该selection,同时将selection对象修改为插入点类型//且定位到之前的selection区域头部
        if ( ThisApplication.Options.ReplaceSelection ) 
        {
            Object direction = Word.WdCollapseDirection.wdCollapseStart;
            sln.Collapse(ref direction);
        }
       //插入文本与段落标记
        sln.TypeText("Inserting before a text block. ");
        sln.TypeParagraph();
    }
    else
    {
        // Do nothing.
    }
}
-----------------------------------------------------------------------
« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。