пятница, января 27, 2006

«About» ToolPart

Подсмотрел у кого-то и поразвивал примочку для вывода панельки «About…» в панели настройки веб-части.
Сам класс панели :

public class About: Microsoft.SharePoint.WebPartPages .ToolPart
{
      public About()
      {
            this . Title = "O
веб -части..." ;
      }
      string bCard="© DkmS, 2005..06 ";
      /// <summary>
      /// Parent Webpart
      /// </summary>
      public WebPart ParentWP{
            get{return parent;}
            set {parent= value;}
      }
      protected override void OnInit(EventArgs e) {
            base .OnInit (e);
      }
      public override void ApplyChanges(){}
      public override void SyncChanges(){}
      public override void CancelChanges(){}
      protected override void RenderToolPart(HtmlTextWriter output){
            output .Write("<center>" );
            output.Write( "<div title='"+bCard +"'>");
            output.Write("<br><b>My cool WebPart.</b><br><br>" );
            output.Write("</div>");
            output . Write("</center>");
            output.Write("<br><br><hr>" );
      }
}

Использование:

В вызывающем классе изменяем метод

public override ToolPart[] GetToolParts() {
      ToolPart[] baseTP = base .GetToolParts ();
      ToolPart[] myTP =new ToolPart[3];
      WebPartToolPart std=baseTP[ 0] as WebPartToolPart;
      CustomPropertyToolPart myprops=baseTP[1] as CustomPropertyToolPart;
      myTP[0]=myprops;

      myTP[2]=std;
      About about=new About();
      about.ParentWP= this;
      myTP[1]=about;
      return myTP;
}

среда, января 25, 2006

Обработка обращения к IIS по "неправильному" порту.

Сильно похоже, что до web-сервера запросы вида http://server:port в случае, когда обработка такого порта на самом сервере не предусмотрена, просто не доходят.
Сообщение типа The page you are looking for is currently unavailable (вариант английского IE) формирует сам браузер. Например, русский Firefox в таких случаях сообщает: Попытка соединения не удалась. Firefox не может установить соединение с сервером server:port. У IE такая же реакция наблюдается и при обращении к заведомо несуществующему серверу (http://nonexistserver). FF при этом пытается организовать поиск при помощи Google.
 
Поэтому сделать некий универсальный обработчик таких обращений невозможно. Можно лишь сделать обработку ставших недействительными существовавших ранее обращений путём организации виртуального сервера, обрабатывающего запросы с использованием "неверного порта". При обработке можно как перенаправлять запросы, так и формировать какие-либо сообщения.
 

четверг, января 19, 2006

Очередной прикол от Sharepoint

При реализации "Удаления" записей списка в "корзину" добавил к списку поле _deleted_ типа Boolean, в который ставил признак "удаления".
Но не всё так просто, MS лёгких путей не ищет:
конструкция list.Items.GetDataTable(); иногда возвращает в этом поле DBNull, иногда и правильные значения.
В итоге пришлось сделать поле целого типа и проверять на == 1.
 
Блин.

Application settings in C# 2.0 continued

Обнаружилась засада - не может засады не быть!
 
Для проекта типа "Class Library" можно задать настройки ровно так же, как и для проекта "Application". Разница небольшая - при загрузке сборки чтения конфига не происходит. Даже принудительное перечитывание при помощи settings.Reload(); ничего не прибавляет. Модуль работает с теми значениями настроек, которые были записаны в качестве default'ных.
 
Пришлось написать процедуру считывания значений настроек.

void LoadSettings(ref object settings) {
    PropertyInfo[] props = settings.GetType().GetProperties();
   
string path = this.GetType().Assembly.Location;
   
string cfgpath=path+".config";
   
if (! File.Exists(cfgpath)) return;
   
XmlDocument cfg = new XmlDocument();
   
try {
        cfg.Load(cfgpath);
    }
catch (Exception err) {
        ....
       
return;
    }
   
foreach (PropertyInfo prop in props) {
       
if (!prop.CanWrite) continue;
       
XmlNode setting = cfg.SelectSingleNode("//setting[@name = '" + prop.Name + "']" );
       
object value = "";
        if (setting != null) {
            
try {
                value = setting.SelectSingleNode(
"value").InnerText;
               
prop.SetValue(settings, value, null);
           
} catch { }
        }
    }
}

Использование:

object osettings = new Settings();
LoadSettings(
ref osettings);
settings = (
Settings)osettings;

Примечание. При настройке параметров в VS 2005 область действия (Scope) следует установить User (иначе будет сгенерён класс Settings с readonly свойствами).

вторник, января 17, 2006

«Секретная» страница

Соорудил aspx-страницу с авторизацией.
Для каждого юзера выдаётся список предназначенных для него файлов, которые можно сгрузить.
Регулируется вот таким конфигом:

<?xml version="1.0" encoding="utf-8" ?>
<users>
<user dirs="adir" pwd="ap" name="anton">
<user dirs="*" pwd="dp" name="DkmS">
</users>


Вполне даже симпатично получилось. Заодно кой-чему научился.

воскресенье, января 15, 2006

Settins & Versions

Хорошая вещь Properties.Settings, но не до конца продуманная.
Засада - в хранении пользовательских настроек. Без всяких споров/разговоров сохраняются в файле %USERPROFILE%\Local Settings\Application Data\<Company Name>\<appdomainname>_<eid>_<hash>\<verison>\user.config .
И вот из-за этой <verison> и всё горе - используется значение атрибута assembly:AssemblyVersion , которое у меня обычно выставляется автоматом наподобие "1.0.0.*", что довольно удобно при протоколировании . Но при отладке всё, естественно, корёжится.
Пришлось начать использовать атрибут assembly:AssemblyFileVersionAttribute, который студия (Express, по меньшей мере) автоматом менять не умеет. Для получения версии исполняемого файла пользуюсь процедурой
public static string AnyVersion( Assembly assembly) {
object[] attrs=null;
try{
    attrs=assembly.GetCustomAttributes(
typeof(AssemblyFileVersionAttribute ),false);
}
catch{}
if (attrs != null && attrs.Length > 0) {
   
return ((AssemblyFileVersionAttribute)attrs[0]).Version;
}
return assembly.GetName().Version.ToString(4);
}
 
Использование - AnyVersion(Assembly.GetExecutingAssembly()) или ещё как...

четверг, января 12, 2006

Application settings in C# 2.0

Использование новых возможностей по конфигурированию приложений в VS 2005 применительно к VB.NET описано вот тут.

В C# настройка средствами VS (в т.ч. Express Edition) выполняется точно так же. Отличается, ввиду отсутствия в C# конструкции My.Settings, способ использования этих средств.

В модуле, где необходимо использовать настройки, нужно подключить пространство имён Properties:

using MyProgram.Properties;

В соответствующем классе объявить член класса:

private Settings settings = new Settings();

Поля этого класса уже можно использовать по назначению:

this.Size = settings.MainFormSize;

Замечание.

Такую же операцию следует выполнить во всех использующих настройки модулях (классах, формах и т.п.).