решение1
Theценитьне может содержать более 255 символов и в любом случае не отображается в документе — даже для этого вам пришлось бы «сопоставить» элемент управления содержимым с элементом в пользовательской XML-части, сопоставить элемент управления содержимым в виде простого текста с этим элементом и поместить этот элемент управления в документ.
Поэтому вам придется сделать это каким-то другим способом. Есть несколько возможностей, каждая из которых имеет свои преимущества и недостатки. например, поместить все ваши тексты в записях Building Block в определенную Галерею (например, «Custom 1» и Категорию (например, ту, которую вы создаете специально для этого элемента управления). б. использовать раскрывающийся список полей устаревшей формы и поле, которое вставляет нужное вам значение в зависимости от выбранного значения. в. «использовать VBA».
(a) и (b) — единственные подходы, которые я могу придумать, не требующие VBA. Как только вы используете VBA, появляется ряд возможностей.
Для (a) записи Building Block должны быть в шаблоне Word или специальном шаблоне Building Block. Поэтому, если вам нужно решение с одним файлом, вам нужно сделать документ .dotx, а не .docx. Насколько мне известно, механизм Building Block недоступен на Mac. Вы в основном выбираете (предопределенную галерею и создаете категорию, помещаете все записи, которые хотите отобразить, в раскрывающийся список в этой галерее/категории, затем настраиваете свойства элемента управления Building Block Content для использования этой галереи/категории. Содержимое выбранной записи отображается непосредственно в элементе управления. Building Blockименаи содержимое отображаются в "выпадающем списке". Имена имеют ограничение по длине (кажется, 32 символа).
Для (b) вы создаете раскрывающийся список полей формы с нужными вам «отображаемыми именами» и устанавливаете поле формы на «рассчитывать при выходе». Я думаю, что вы ограничены 25 вариантами. Отображаемые имена ограничены примерно 50 символами.
Затем вы настраиваете одно или несколько полей, которые отображают нужный вам текст, используя "отображаемое имя". В простейшем случае вы можете использовать одно поле IF для каждого раскрывающегося списка, так что если раскрывающийся список имеет значения "abc", "def", "ghi" и т. д., вы можете использовать
{ IF "{ Dropdown1 }" = "abc" "The chunk of text you want for abc" "" }{ IF "{ Dropdown1 }" = "def" "The chunk of text you want for def" "" }
Затем вам нужно «защитить документ для форм», что означает, что пользователь не может ничего редактировать, кроме заполнения формы. Или вы можете защитить часть документа, и в этом случае пользователь сможет редактировать оставшуюся часть документа с некоторыми ограничениями.
Если вы пойдете по пути VBA, предположим, что вы собираетесь использовать раскрывающийся список Content Control. Затем вам понадобится событие для запуска вашего VBA — вы можете использовать событие Content Control или, если вы сопоставляете свой Content Control с Custom XML Part, вы можете использовать событие "Datastore" (связанное с XML Part). Затем ваш VBA должен знать, где отображать текст и какой текст отображать.
Итак, представим, что ваш раскрывающийся список имеет Title dd1
, вы собираетесь поместить свой текст в элемент управления содержимым обычного текста с заголовком tb1
, а "отображаемые имена" вашего раскрывающегося списка — my display name 1
, my display name 2
и так далее. Затем вы можете поместить следующий код VBA в свой ThisDocument
модуль. Он "сработает", когда вы щелкните за пределами раскрывающегося списка или перейдете на вкладку из него.
Примечание: чтобы это работало, свойство tb1 «Содержимое не может быть отредактировано» должно бытьнепроверенный
Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
Dim cc1 As ContentControl
Select Case ContentControl.Title
' the dropdown
Case "dd1"
' Assumes "tb1" exists
Set cc1 = ContentControl.Range.Document.SelectContentControlsByTitle("tb1")(1)
If ContentControl.ShowingPlaceholderText Then
' Resets tb1 to its placeholder text
cc1.Range.Text = ""
Else
Select Case ContentControl.Range.Text
Case "my display name 1"
cc1.Range.Text = "whatever text you want for abc"
Case "my display name 2"
cc1.Range.Text = "whatever text you want for def"
Case Else
'
End Select
End If
Set cc1 = Nothing
Case Else
'
End Select
End Sub
Лично я предпочитаю использовать сопоставление управления содержимым и события хранилища данных, но это сложнее, и я думаю, что описанный выше подход должен соответствовать требованиям, которые вы описали.