четверг, 22 сентября 2011 г.

js для ButtonField ButtonType="Image" в GridView

Спросили меня на днях, как добавить js для ButtonField ButtonType="Image", вроде мелоч а сразу и не сообразил, не долго лазия в google дал ответ))):
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
 if (e.Row.RowType == DataControlRowType.DataRow &&

  (e.Row.RowState ==

 DataControlRowState.Normal || e.Row.RowState == DataControlRowState.Alternate))
  {
  if (e.Row.Cells[columnGrid].Controls[0] is ImageButton)
   {
    ((ImageButton)e.Row.Cells[columnGrid].Controls[0]).Attributes.Add("onclick",
    "alert('123');");
   }
  }
}

Redirect с формы создание нового элемента списка

Заметил на не скольких форумах, что народ спрашивает, как можно после нажатия на кнопку сохранить переходить не на страницу с представлением списка, а например на главную. Есть несколько врянтов, один из которых изменить ссылку на форму. У меня в проекте есть веб-часть в ней несколько ссылок на создания элементов в разных списках. Веб-часть находится на странице http://mysite/mainPage.aspx и мне надо было сделать, так, что пользователь после добавления элемента переходил на главную страницу. Чтобы это организовать можно адрес формы http://mysite/Lists/newList/NewForm.aspx заменить на http://mysite/Lists/newList/NewForm.aspx?Source=http%3A%2F%2Fmysite. Вот собственно говоря и все!

среда, 21 сентября 2011 г.

Запись в PeopleEditor

Решил записать данные в PeopleEditor, нашел такой способ:

ArrayList arList = new ArrayList();
PickerEntity ent = new PickerEntity();
ent.Key = userName;
arList.Add(ent);
PeopleEditor1.UpdateEntities(arList);

пятница, 16 сентября 2011 г.

Custom DispForms

При создании в SharePoint Designer новой custom dispForm из формы пропадает отображение вложения списка. Стандартная форма списка(dispForm):
Мы видем, что на форме отображается поле Вложение, теперь если изменить форму dispForm на созданную в designere, то мы увидем, что поле Вложение пропало:

Чтобы устранить эту проблему можно сделать следующее:
1. В SharePoint Designer в новой customDispForm добавляем нову строку:



2. Нажимаем на первый столбец строки, удаляем строчку - " <xsl:text xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" ddwrt:nbsp-preserve="yes" disable-output-escaping="yes">&amp;nbsp;</xsl:text> " и вместо нее вставляем - " <nobr>Вложение</nobr> "

3. Удалем строчку и из второго столбца и вставляем - " <SharePoint:AttachmentsField ControlMode="Display" FieldName="Attachments" runat="server" Visible="true"/> "

Теперь обновляем и видим:

понедельник, 5 сентября 2011 г.

Получение данных из asp:FileUpload и запись в ListItem.Attachment

В веб-часть добавим:

<asp:FileUpload ID="FileUpload1" runat="server"/>
   
в code behinde пишем:

ViewState["fileContents"] = GetFileContents(FileUpload1.PostedFile);

byte[] myfile = (byte[])ViewState["fileContents"];

SPListItem item = web.Lists["nameList"].Items.Add();
item["Title"]="nameListItem";
item.Attachments.Add(FileUpload1.FileName, myfile);
item.Update()
private byte[] GetFileContents(HttpPostedFile postedFile)
        {           
            HttpPostedFile file = postedFile;
            Stream fstream = file.InputStream;
            byte[] contents = new byte[fstream.Length];
            fstream.Read(contents, 0, (int)fstream.Length);
            fstream.Close();
            fstream.Dispose();
            return contents;
        }

Получение данных из SharePoint:PeopleEditor и запись в SPFieldUserValueCollection

В веб-часть добавляем:

<SharePoint:PeopleEditor ID="PeopleEditor1" BorderStyle="Solid" BorderWidth="1" BorderColor="Black" runat="server" AllowEmpty="false" MultiSelect="true" SelectionSet="User" />

в code behinde пишем:

SPFieldUserValueCollection
fieldUserValueColl = new SPFieldUserValueCollection();
int index = 0;
for (index = 0; index <= this.PeopleEditor1.ResolvedEntities.Count - 1; ++index)
{
PickerEntity pickerEntity = (PickerEntity)this.PeopleEditor1.ResolvedEntities[index];
fieldUserValueColl.Add(
new SPFieldUserValue(web, Convert.ToInt32(pickerEntity.EntityData["SPUserID"]), pickerEntity.Key));
}
Propertis.ListItem["Соавторы"] = fieldUserValueColl;
Propertis.ListItem.Update();

вторник, 26 июля 2011 г.

Добавление пользователя в разрешения списка

           SPSite site = new SPSite("http://localhost/site");
           SPWeb web = site.OpenWeb();
           SPList list = web.Lists["nameList"];
           list.BreakRoleInheritance(false);

           SPUser user = new SPFieldUserValue(web, properties.ListItem["AssignedTo"].ToString()).User;
           SPRoleDefinition role = web.RoleDefinitions["nameRole"];
           SPPrincipal PrincipalEmployees = user;
           SPRoleAssignment RoleAssignmentEmp = new SPRoleAssignment(PrincipalEmployees);
           RoleAssignmentEmp.RoleDefinitionBindings.Add(role);
           list.RoleAssignments.Add(RoleAssignmentEmp);
     list.Update();

понедельник, 25 июля 2011 г.

Копирование элемента списка

SPSite site = new SPSite("http://localhost/");
           SPWeb web = site.OpenWeb();
           SPList list = web.Lists["Задачи"];
           SPListItem sourceItem = properties.ListItem;
           SPListItem item = list.Items.Add();
           //Копируем поля
           foreach (SPField f in sourceItem.Fields)
           {
               if (!f.ReadOnlyField && f.InternalName != "Attachments")
               {
                   item[f.InternalName] = sourceItem[f.InternalName];
               }
           }
           // Копируем вложение
           foreach (string fileName in sourceItem.Attachments)
           {
               SPFile file = sourceItem.ParentList.ParentWeb.GetFile(sourceItem.Attachments.UrlPrefix + fileName);
               byte[] bData = file.OpenBinary();
               item.Attachments.Add(fileName, bData);
           }
           item.Update();

понедельник, 18 июля 2011 г.

Everything 2

1. Выполнение кода от имени системной учетки:
Иногда требуется повысить права пользователя, для этого можно использовать конструкцию:
SPSecurity.RunWithElevatedPrivileges(delegate()
{
Your code…
});
2. Переход на новую страницу в ItemUpdating:
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = SPUtility.ConcatUrls(properties.Web.ServerRelativeUrl, "/_layouts/nameFolder/namePage.aspx");
3. Передача параметра в страке запросы и прием его на странице:
properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = SPUtility.ConcatUrls(properties.Web.ServerRelativeUrl, "/_layouts/nameFolder/namePage.aspx"+"&source=1");
Теперь на странице namePage.aspx.cs в методе Page_Load пишем:
string par = Request.QueryString["sourse"];
Теперь par = 1;
4. Замена wsp на ферме с помощью PowerShell'a
Uninstall-SPSolution -Identity name.wsp -local -Confirm:$false
Remove-SPSolution -Identity name.wsp -Confirm:$false
Add-SPSolution -LiteralPath d:\Folder\name.wsp
Install-SPSolution -GACDeployment -Identity name.wsp
5. После установки SP1 в SPF перестал работать поиск(не может соедениться со службой поиска):
В командной строке в каталог: %COMMONPROGRAMFILES%\Microsoft shared\Web server extensions\12\Bin выполнить команду:

psconfig –cmd upgrade –inplace b2b –wait –force
Далее запустить остановившиеся службы SP.

четверг, 14 июля 2011 г.

Everything

В этот пост я решил складывать всякие мелочи, которые буду узнавать в ходе работы с SharePoint.

1. Для создания WinForms или ConsolApplication необходимо в свойствах проекта указать:
a) Требуемая версия .NET Framework: .NET Framework 3.5
б) Конечная платформа: x64

2. Получение url вложения списка:
string fileName = properties.ListItem.Attachments[0];
string strPath = properties.ListItem.Attachments.UrlPrefix + fileName;

3. Получение user'ов из группы SharePoint:
SPSite site = new SPSite("http://localhost/");
SPWeb web = site.OpenWeb();
SPUserCollection userCollection = web.Groups["Сайт группы - посетители"].Users;
foreach (SPUser user in userCollection)
{
string userName = user.LoginName;
}

4. Если Вы вызываете в обработчике события Update - то он же, опять, вызывает обработчик события и так в цикле. Для того чтобы это не происходило - нужно использоватьEventFiringEnabled.:

EventFiringEnabled = false;
properties.ListItem.Update();
EventFiringEnabled = true;

5. Получение текущего пользователя:
SPSite site = new SPSite("http://localhost/");
SPWeb web = siteDeps.OpenWeb();
SPFieldUserValue currentUser = new SPFieldUserValue(web, web.CurrentUser.ID, web.CurrentUser.LoginName);

6. Создание группы в SharePoint:
SPSite site = new SPSite("http://localhost/");
SPWeb web = siteDeps.OpenWeb();

SPUserCollection users = web.AllUsers;
SPUser owner = users[@"Domain\userName"];
SPMember member = users[@"Domain\userName"];

SPGroupCollection groups = web.SiteGroups;
groups.Add("nameGroup", member, owner, "Discriptions");
web.Update();

7. Поле выбор(флажки), заполнение по умолчанию:
Заходим в свойства столбца, в значение по умолчанию выбираем - вычисляемое значение и в поле пишем: =";#1;#2;#3;#4;#" 

пятница, 8 июля 2011 г.

Каскадные поля с помощью spcd.js

Для создания каскадных полей на потребуется скачать js библиотеку spcd.js. Добавим ее в библиотеку на нашем сайте.
Есть 3 списка
1. Customers - В нем хранятся заказчики

2. Objects - В нем хранятся наименование объектов и кому они принадлежат, поле Customer в этом списке - это поле lookUp на поле Customer в списке Customers.

3. Request - В этом хранится заявки:

1 поле - номер заявки
2 поле - выбираем заказчика
3 поле - выбираем объект (объекты должны выпадать, только те, которые принадлежат выбранному заказчику).
И так, заходим в список Request, на ленте выбираем Список -> Изменить веб-часть формы и выбираем - Форма создания по умалчанию.
Теперь нужно добавить редактор контента:
перетаскиваем редактор контента в самый низ
Нажимаем на него

И в редакторе контента подключаем spcd.js:
<script src="/Base/Shared%20Documents/spcd.js" type="text/javascript"></script><script type="text/javascript">
var ccd1 = new cascadeDropdowns("Customer", "Object", "Customer", "95895e3b-a752-4b87-915e-cc785fe30d31", "Title");

  </script>
"95895e3b-a752-4b87-915e-cc785fe30d31" - Id списка Object
В итоги при выборе заказчика в поле объект будет выбираться, только объекты принадлежащие этому заказчику

понедельник, 27 июня 2011 г.

Сериализация в C#

Стояла задача: сохранение значений формы приложения, решил использовать сериализацию. Разработал класс, в котором будут храниться значения с элементов формы:
public class DataClass
{
public DataClass() { }
public string TextBox = "";
public string RichTextBox = "";
}

При загрузки формы делаю десериализацию:
private void Form1_Load(object sender, EventArgs e)
{
XmlReader reader = new XmlTextReader("nameXml.xml");
XmlSerializer serializer = new XmlSerializer(typeof(DataClass)); DataClass sd = (DataClass)serializer.Deserialize(reader); reader.Close();
reader.Close();
textBox1.Text = sd.TextBox;
richTextBox1.Text = sd.RichTextBox;
}

При закрытии сериализацию:
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
DataClass obj = new DataClass();
obj.TextBox = textBox1.Text;
obj.RichTextBox = richTextBox1.Text;
XmlWriter writer = new XmlTextWriter("nameXml.xml", System.Text.Encoding.UTF8);
XmlSerializer sr = new XmlSerializer(obj.GetType());
sr.Serialize(writer, obj);
writer.Close();
}

четверг, 23 июня 2011 г.

Programmatically creates list and list items

             using (SPSite site = new SPSite("http://localhost/Base"))
            {
                using (SPWeb web = site.OpenWeb())
                {
                    SPListCollection listCollection = web.Lists;
                    listCollection.Add("nameList","discriptionList",SPListTemplateType.GenericList);
                    //- SPListTemplateType.GenericList - настраеваемый список
                    SPList list = web.Lists["nameList"];
                  
                    //- list.EnableVersioning = true; - Включить создание версий
                    //- list.BreakRoleInheritance(false); - Прекратить наследование разрешений
                    SPList listTask= web.Lists["Задачи"];
                    SPField fieldTask=listTask.Fields["Название"];

                    //- Представление списка по-умолчанию
                    SPView viewList = list.DefaultView;

                    //Добавление текстового поля
                    list.Fields.Add("nameField1", SPFieldType.Text, true);
                    //Добавляем поле в представление
                    viewList.ViewFields.Add("nameField1");

                    //Добавление поля дата и время
                    list.Fields.Add("nameField2", SPFieldType.DateTime, true);
                    viewList.ViewFields.Add("nameField2");

                    //Добавление поля ссылка
                    list.Fields.Add("nameField3", SPFieldType.URL, true);
                    viewList.ViewFields.Add("nameField3");

                    //Добавление поля пользователь
                    list.Fields.Add("nameField4", SPFieldType.User, true);
                    viewList.ViewFields.Add("nameField4");

                    //Добавление поля lookUp
       list.Fields.AddLookup("nameField5", listTask.ID, false);
      SPFieldLookup fieldLookup = (SPFieldLookup)list.Fields["nameField5"];
       fieldLookup.LookupField = fieldTask.InternalName;
       fieldLookup.Update();
       viewList.ViewFields.Add("nameField5");
       viewList.Update();

// Добавление поля Выбор
StringCollection categories = new StringCollection();
categories.AddRange(new string[] { "item1", "item2", "item3" });

list.Fields.Add("fromPosit", SPFieldType.Choice, true, false, categories);
SPFieldChoice fieldChoice = (SPFieldChoice)list.Fields["nameField6"];
fieldChoice.DefaultValue = "item1"; //Значение по-умолчанию
fieldChoice.EditFormat = SPChoiceFormatType.RadioButtons; //Формат выбора
fieldChoice.Update();
viewList.ViewFields.Add("nameField6");


//По умолчанию поля обязательно должны быть заполнены
//Для того чтобы сделать поля не обязательны для заполнения нужно:
                    SPField fieldList = list.Fields["nameField1"];
                    fieldList.Required = false;
                    fieldList.Update();

                    //Для добавления списка в панель быстрого запуска
                    //установить свойство OnQuickLaunch=true
                    list.OnQuickLaunch = true;
                    list.Update();
                   
                }
            }

вторник, 21 июня 2011 г.

SPGridView и WebPart

Создадим новый проект (Визуальная веб-часть)  и в UserControl.ascx.cs в метод
Page_Load(object sender, EventArgs e) добавим:

SPSite Site = SPContext.Current.Site;
SPList List = Site.AllWebs["nameSite"].Lists["nameList"];
SPQuery query = new SPQuery();
query.Query = "<Where>" +
"<Eq>" +
"<FieldRef Name=\"nameField\" />" +
"<Value Type=\"Text\">Text1</Value>" +
"</Eq>" +
"</Where>";

SPListItemCollection listColl = List.GetItems(query);
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Field1");
dataTable.Columns.Add("Field2");

foreach (SPListItem item in listColl)
{
DataRow dataRow = dataTable.NewRow();
dataRow["Field1"] = item["Field1"].ToString();
dataRow["Field2"] = item["Field2"].ToString();
dataTable.Rows.Add(dataRow);
}

DataView dataView = new DataView(dataTable);
dataTable = dataView.ToTable(true, "Field1", "Field2");


SPGridView gridView = new SPGridView();
gridView.ID = "idgridView";
gridView.AutoGenerateColumns = false;
BoundField field1 = new BoundField();
field1.HeaderText = "displayName1";
field1.DataField = "Field1";
gridView.Columns.Add(field1);

BoundField field2 = new BoundField();
field2.HeaderText = "displayName2";
field2.DataField = "Field2";
gridView.Columns.Add(field2);

this.Controls.Add(gridView);
base.CreateChildControls();

gridView.DataSource = dataTable;
gridView.DataBind();
На странице добавится веб-часть с SPGriedView и в нем 2 поля. С помощью Query отфильтруется по полю nameField = Text1;

понедельник, 20 июня 2011 г.

Программное создание представления для списка

using (SPSite site = new SPSite("http://siteUrl"))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["nameList"];
System.Collections.Specialized.StringCollection stringColl = new System.Collections.Specialized.StringCollection();
//добавляем поля которые будут в представлении
stringColl.Add("LinkTitle");
stringColl.Add("Title");
list.Views.Add("nameViews", stringColl, @"", 100, true, true, Microsoft.SharePoint.SPViewCollection.SPViewType.Html, false);
list.Update();
}
}
В Views.Add последний параметр указывает на то, общее или персональное будет представление.
Если параметр true то представление будет персональным и создастся оно для пользователя который запустил приложение, чтобы добавить представление для другого пользователя нужно сделать имперсонализацию:
string userName = "Domen\\userName";
SPUserToken userToken = web.AllUsers[userName].UserToken;
using (SPSite site = new SPSite("http://siteUrl", userToken))
{
using (SPWeb web = site.OpenWeb())
{
}
}
Так же к представлению можно добавить фильтр:
string userName = "Domen\\userName";
SPUserToken userToken = web.AllUsers[userName].UserToken;
using (SPSite site = new SPSite("http://siteUrl", userToken))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["nameList"];
System.Collections.Specialized.StringCollection stringColl = new System.Collections.Specialized.StringCollection();

stringColl.Add("LinkTitle");
stringColl.Add("Title");
list.Views.Add("nameViews", stringColl, @"", 100, true, true, Microsoft.SharePoint.SPViewCollection.SPViewType.Html, false);
list.Update();

SPView view = list.Views["nameViews"];
viewTest.Query =
"<Where>" +
"<Or>"+
"<Eq>"+
"<FieldRef Name=\"InternalNameField\" />"+
"<Value Type=\"Text\">nameUser1</Value>"+
"</Eq>"+
"<Eq>"+
"<FieldRef Name=\"internalNameField\" />"+
"<Value Type=\"Text\">nameUser2</Value>"+
"</Eq>"+
"</Or>"+
"</Where>";
view.Update();
}
}

//добавляем поля которые будут в представлении