В SharePoint 2007 нет возможности выбирать элементы (на форме поиска) как это сделано в версии 2010.
Но можно создать свое кастомное поле. Для этого создадим пустой проект и добавим туда FieldControl. Нам не придется сегодня писать код на C#, весь функционал будет заключен в файле fldtypes_IdAsCheckBoxField.xml.
<?xml version="1.0" encoding="utf-8"?>
<FieldTypes>
<FieldType>
<Field Name="TypeName">IdAsCheckBoxFieldType</Field>
<Field Name="ParentType">Text</Field>
<Field Name="TypeDisplayName">Поле выбора ID чек-бокс</Field>
<Field Name="TypeShortDescription"> Поле выбора ID чек-бокс</Field>
<Field Name="UserCreatable">TRUE</Field>
<Field Name="Sortable">FALSE</Field>
<Field Name="AllowBaseTypeRendering">TRUE</Field>
<Field Name="Filterable">FALSE</Field>
<Field Name="ShowOnColumnTemplateCreate">FALSE</Field>
<Field Name="ShowOnListCreate">TRUE</Field>
<Field Name="ShowOnDocumentLibraryCreate">FALSE</Field>
<Field Name="ShowOnSurveyCreate">FALSE</Field>
<Field Name="CAMLRendering">FALSE</Field>
<Field Name="FieldTypeClass">IdAsCheckBoxField.IdAsCheckBoxFieldControlField, IdAsCheckBoxField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e23d8e7bd9476393</Field>
<PropertySchema>
<Fields>
</Fields>
</PropertySchema>
<RenderPattern Name="HeaderPattern">
<HTML>
<![CDATA[
<script type="text/javascript">
if (typeof getElementsByAttributeValue == 'function') {
function getElementsByAttributeValue (attribute, value){
var dom = document.getElementsByTagName("*");
var match = new Array();
for (var i in dom) {
if ((typeof dom[i]) === "object"){
if (dom[i].getAttribute(attribute) === value){
match.push(dom[i]);
}
}
}
return match;
};
}
if (typeof ToggleSelection == 'function') {
function ToggleSelection(sender, ColumnDisplayName){
var chkboxes = getElementsByAttributeValue('Column', ColumnDisplayName);
var cur=sender.getAttribute('tgl').toString() == true.toString();
for (var i = 0; i < chkboxes.length; i++) {
chkboxes[i].checked = !cur;
}
sender.setAttribute('tgl',!cur);
};
}
if (typeof GetCheckedItems == 'function') {
function GetCheckedItems(ColumnDisplayName)
{
var jsonArr = [];
var chkboxes = getElementsByAttributeValue('Column', ColumnDisplayName);
for (var i = 0; i < chkboxes.length; i++) {
if(chkboxes[i].checked==true)
{
jsonArr.push({
'ItemId':chkboxes[i].getAttribute('ItemId'),
'Title':chkboxes[i].getAttribute('Title')
});
}
}
return jsonArr;
}
}
</script>
]]>
</HTML>
<HTML><![CDATA[<a tgl='false' onclick='ToggleSelection(this,"]]></HTML>
<Property Select='DisplayName' HTMLEncode='TRUE'/>
<HTML><![CDATA[");return false;' href="Javascript:ToggleSelection(this,']]></HTML>
<Property Select='DisplayName' HTMLEncode='TRUE'/>
<HTML><![CDATA[')"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px;" alt="Выбрать или очистить все" src="/_layouts/images/unchecka.gif" /></a>]]></HTML>
<HTML><![CDATA[ ]]></HTML>
<Property Select='DisplayName' HTMLEncode='TRUE'/>
</RenderPattern>
<RenderPattern Name="DisplayPattern">
<HTML><![CDATA[<input type="checkbox" ]]></HTML>
<HTML><![CDATA[ItemId="]]></HTML>
<Column Name="ID" HTMLEncode="TRUE" />
<HTML><![CDATA[" ]]></HTML>
<HTML><![CDATA[Title="]]></HTML>
<Column Name="Title" HTMLEncode="TRUE" />
<HTML><![CDATA[" ]]></HTML>
<HTML><![CDATA[Column="]]></HTML>
<Property Select='DisplayName' HTMLEncode='TRUE'/>
<HTML><![CDATA[" ]]></HTML>
<HTML><![CDATA[ /> ]]></HTML>
</RenderPattern>
</FieldType>
</FieldTypes>
Сразу хочу сказать что FieldTypeClass в принципе не нужен, он ссылается на пустой проект.
В коде есть 3 javascript функции:
- getElementsByAttributeValue - получает все элементы чекбоксы нужой группы
- ToggleSelection - переключает чекбоксы
- и GetCheckedItems - получает все выбранные элементы в виде JSON массива
Для удобства в сам чекбок вшита вся нужная информация:
ID строки, заголовок и название колонки к которой оно относится.
Получение выделенных элементов:
Надеюсь что кому-то пригодится и поможет. Спасибо