2016-09-07 83 views
0

C#限制編輯部分字段

允許用戶編輯黃色段落。 但我得到這個文件: wrong document

我用字限制編輯功能,我的代碼是:

//寫入段落 
foreach (TaskChaptersModel chapter in listChapter) 
{ 
    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = chapter.chapterNo + " " + chapter.chapterName; 

    //標題1 
    if (!chapter.chapterNo.Contains(".")) 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中 
    } 
    else if (chapter.chapterNo.Select(c => c == '.').Count() == 1) 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左對齊 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    else 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Size = 12;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左對齊 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    paragraph.Range.InsertParagraphAfter(); 

    //------------------------------------------------------------------- 
    //This paragraph alow edit 
    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = "請您編輯,張三"; 
    paragraph.Range.Editors.Add(Word.WdEditorType.wdEditorEveryone); 
    paragraph.Range.InsertParagraphAfter();      
    //------------------------------------------------------------------- 
} 

doc.Protect(Word.WdProtectionType.wdAllowOnlyReading, false, "000", false, true); 

我的想法是在指定的段落添加編輯器。

+0

爲什麼你不能使用[允許更改受保護文檔的部分?](https://support.office.com/en-gb/article/Allow -changes-to-parts-of-a-protected-document-187ed01c-8795-43e1-9fd0-c9fca419dadf) – PetLahev

回答

0

明白了: 1,創建文檔 2,循環的所有段落在正確的paragra添加編輯ph 我發現在創建文檔時我無法添加編輯器。

//寫入段落

foreach (TaskChaptersModel chapter in listChapter) 
{ 
    if (chapter.chapterNo == null || chapter.chapterNo == "-1") 
    { 
     continue; 
    } 

    paragraph = doc.Content.Paragraphs.Add(); 
    paragraph.Range.Text = chapter.chapterNo + " " + chapter.chapterName; 

    //標題1 
    if (!chapter.chapterNo.Contains(".")) 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;//水平居中 
    } 
    else if (chapter.chapterNo.Select(c => c == '.').Count() == 1) 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Bold = 2;//加粗 
     paragraph.Range.Font.Size = 16;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左對齊 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 
    else 
    { 
     paragraph.Range.Font.Name = "宋體";//宋體 
     paragraph.Range.Font.Size = 12;//三號 
     paragraph.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft;//左對齊 
     paragraph.Format.LineSpacingRule = Word.WdLineSpacing.wdLineSpace1pt5; 
    } 

    paragraph.Range.InsertParagraphAfter(); 
    paragraph = doc.Content.Paragraphs.Add();          
    //有編輯權限 
    if (chapter.wordFlag == "E") 
    { 
     paragraph.Range.Text = "請您編輯," + userName;       
    } 
    else 
    { 
     paragraph.Range.HighlightColorIndex = Word.WdColorIndex.wdGray25; 
    } 
    paragraph.Range.InsertParagraphAfter(); 
} 

foreach (Word.Paragraph p in doc.Paragraphs) 
{ 
    if (p.Range.Text.Contains("請您編輯")) 
    { 
     p.Range.Select(); 
     p.Range.Editors.Add(Word.WdEditorType.wdEditorEveryone); 
    } 
} 
1

你的想法是正確的,但是Word的行爲與預期略有不同。我注意到,就像你一樣,不管添加新的段落,新的段落都可以編輯,即使你沒有在新的段落中專門添加編輯。

因此,您需要將其轉換,將所有人都添加到完整文檔中,並通過從要保護的部分中刪除編輯器來解決其他問題。

爲了給你一個想法,我創建了一小段VBA代碼,但我相信你可以用C#重寫你需要的部分。另請注意,我循環遍歷編輯器,而不是使用DeleteAll()單獨刪除它們。我發現使用DeleteAll引發了意外的異常。

Sub TestRestrictDocument() 

    If ActiveDocument.ProtectionType <> wdNoProtection Then 
     ActiveDocument.Unprotect "000" 
    End If 

    ActiveDocument.Content.Editors.Add Word.WdEditorType.wdEditorEveryone 

    Dim paragraph As paragraph 

    For I = 1 To 5 

     Set paragraph = ActiveDocument.Paragraphs(I) 

     If I <> 4 Then 
      paragraph.Range.Select 

      Dim objEditor As Editor 

      If Selection.Editors.Count > 0 Then 
       For X = 1 To Selection.Editors.Count 
        Selection.Editors(X).Delete 
       Next 
      End If 
     End If 

    Next 

    ActiveDocument.Protect Word.WdProtectionType.wdAllowOnlyReading, False, "000", False, True 

End Sub 

這個例子顯示了你,(我創建的文檔與5段進行測試)所有,但第四段落進行編輯。很明顯,你可以動態地創建你的文檔,並刪除編輯器。

一些旁註要記住,我碰到了,可能有所幫助:

  • 經常檢查,如果你的文檔已受到保護
  • 始終測試如果範圍編輯刪除
  • 避免DeleteAll在編輯器中由於某種原因
+0

對不起,對於遲到的回覆, 我試過你的解決方案。我發現當我打開一個文檔,它的工作原理,當我創建一個文檔,它仍然faild。 我會在稍後嘗試更多解決方案。 – mymbrooks

+0

注意解決方案,演示代碼包含一行:[ActiveDocument.Content.Editors.Add Word.WdEditorType.wdEditorEveryone],所以如果你在現有頁面上運行它,整個文檔將再次獲得一個編輯器。在現有文檔中,您應該將其保留,並且僅在要更改的範圍上刪除/添加編輯器。 –