2009-09-20 1 views
0

Кто-нибудь открыл способ расширения или изменения функциональных возможностей представления Datasheet SharePoint (вид, используемый при редактировании списка в режиме Datasheet, который выглядит как основной лист Excel)?Расширение или изменение представления SharePoint Datasheet

Мне нужно сделать несколько вещей, если это возможно, но мне еще предстоит найти достойный, не хакерский способ изменить любую функциональность.

EDIT: пример того, что я хочу сделать, - включить каскадную фильтрацию в полях поиска, поэтому выбор в одном поле ограничивает доступные варианты в другом. Существует способ сделать это в стандартной форме представления, но представление таблицы данных полностью разрозненно.

С уважением

Moo

+0

Не могли бы вы дать один конкретный пример изменения, которое вы хотели бы сделать? – Argalatyr

ответ

3

Я не думаю, что вы можете изменить его в любом не хак способом, но вы можете создать новый вид таблицы данных с нуля. Вы делаете это, создавая новый элемент управления ActiveX и выставляя его как COM-объект и изменяя файл web.config, чтобы ссылаться на новый элемент управления ActiveX.

Там пример здесь: Creating a custom datasheet control.

+0

+1: Я понятия не имел, что это возможно! –

0

На самом деле, вы можете сделать это. Вот фрагмент кода, который я снял с места, где я делаю то, что вы просили. Я попытался удалить специфику.

var gridFieldOverrideExample = (function(){ 
    function fieldView(ctx){ 
     var val=ctx.CurrentItem[curFieldName]; 
     var spanId=curFieldName+"span"+ctx.CurrentItem.ID; 
     if (ctx.inGridMode){ 
      handleGridField(ctx, spanId); 
     }  
     return "<span id='"+spanId+"'>"+val+"</span>";  
    } 

    function handleGridField(ctx, spanID){ 
     window.SP.SOD.executeOrDelayUntilScriptLoaded(function(){ 
      window.SP.GanttControl.WaitForGanttCreation(function (ganttChart){ 
       var gridColumn = null; 
       var editID = "EDIT_"+curFieldName+"_GRID_FIELD"; 
       var columns = ganttChart.get_Columns(); 
       for(var i=0;i<columns.length;i++){ 
        if(columns[i].columnKey == curFieldName){ 
         gridColumn = columns[i]; 
         break; 
        } 
       } 
       if (gridColumn){ 
        gridColumn.fnGetEditControlName = function(record, fieldKey){ 
         return editID; 
        }; 
        window.SP.JsGrid.PropertyType.Utils.RegisterEditControl(editID, function (ctx) { 
         editorInstance = new SP.JsGrid.EditControl.EditBoxEditControl(ctx, null); 
         editorInstance.NewValue = ""; 
         editorInstance.SetValue = function (value) { 
          _cellContext = editorInstance.GetCellContext(); 
          _cellContext.SetCurrentValue({ localized: value }); 
         }; 
         editorInstance.Unbind = function() { 
          //This happens when the grid cell loses focus - hide controls here, do cleanup, etc. 
         } 
         //Below I grabbed a reference to the original 'BindToCell' function so I can prepend to it by overwriting the event. 
         var origbtc = editorInstance.BindToCell; 
         editorInstance.BindToCell = function(cellContext){ 
          if ((cellContext.record) && 
           (cellContext.record.properties) && 
           (cellContext.record.properties.ID) && 
           (cellContext.record.properties.ID.dataValue)){ 
           editorInstance.ItemID = cellContext.record.properties.ID.dataValue; 
          } 
          origbtc(cellContext); 
         }; 
         //Below I grabbed a reference to the original 'OnBeginEdit' function so I can prepend to it by overwriting the event.     
         var origbte = editorInstance.OnBeginEdit; 
         editorInstance.TargetID; 
         editorInstance.OnBeginEdit = function (cellContext){ 
          this.TargetID = cellContext.target.ID; 
          /* 
          . . . 
          Here is where you would include any custom rendering 
          . . . 
          */ 
          origbte(cellContext); 
         }; 
         return editorInstance; 
        }, []); 

       } 
      }); 
     },"spgantt.js"); 
    } 

    return{ 
     fieldView : fieldView 
    } 
})(); 

(function() { 
    function OverrideFields(){ 
     var overrideContext = {}; 
     overrideContext.Templates = overrideContext.Templates || {}; 
     overrideContext.Templates.Fields = { 
      'FieldToOverride' : { 
       'View': gridFieldOverrideExample.fieldView 
      } 
     }; 
     SPClientTemplates.TemplateManager.RegisterTemplateOverrides(overrideContext); 
    } 
    ExecuteOrDelayUntilScriptLoaded(OverrideFields, 'clienttemplates.js'); 
})(); 

Кроме того, есть еще несколько других примеров. К сожалению, у меня больше нет ссылок:

+0

На самом деле, я сделал именно то, что вы спросили, с каскадным выбором. За исключением того, что я использовал внешние списки и передавал значения фильтров при выводе данных. В принципе, вы использовали бы приведенный выше код в качестве примера и в событии BindToCell, получите определяющее значение из cellContext.record.properties [""] .localizedValue. Затем вы можете создать свой собственный элемент управления в событии OnBeginEdit. – user3457914

Смежные вопросы