28 December 2010

Add an Item with "Hyperlink" type to a list using PowerShell in Sharepoint 2010

בPost הקודם, הסברתי איך להוסיף פריט לרשימה עם שדה Text פשוט. השאלה איך מוסיפים פריט עם שדה מסובך יותר כמו שדה קישור.

אז בדומה לקוד של c#, השדה מסוג Hyperlink מקבל את הUrl ואת הTitle.

בדוגמא הבאה, אוסיף לרשימה את כל האתרים באתר כפרטים ברשימה ואקשר להם את הUrl הרלוונטים.

foreach ($url in $mySite.allwebs)
{
   $newItem = $MyList.Items.Add();
   $newItem["Title"]= "Site " + $myUrl.url;
   $newItem["myHyperlinkColumn"]= "$($myUrl.url), $(myUrl.title)" ;
   $newItem.Update()
}
 
זה כל כך פשוט

18 December 2010

Create a new list Item in SharePoint 2010 with PowerShell

בהמשך לpost הקודם - Create List and Field in SharePoint 2010 with PowerShell, הפעם אדגים איך להוסיף לרשימה Item חדש.


כל מה שנצטרך זה ליצור פריט, להוסיף את השדות הרלוונטיים ולעדכן.


$newItem = $MyList.Items.Add();
$newItem["Title"] ="Test"; 
$newItem["TextField"] ="Bla Bla bla"; 
$newItem.Update(); # You can write $newItem.SystemUpdate(); 
 
הרבה יותר מהיר מכתיבת קוד .Net רגיל.

11 December 2010

Create List and Field in SharePoint 2010 with PowerShell

אחד הדברים החזקים בSharePoint 2010 – שאפשר לכתוב קוד .Net בלי לקמפל בעזרת PowerShell. הפעם הדגים איך לבנות רשימה ולהוסיף לשדה.


נפתח את ה SharePoint 2010 Management Shell (ראו הסבר ב PowerShell בSharePoint2010)

ניצור Assignment

$MyAssignment = Start-SPAssignment

נפתח את האתר המבוקש על פי URL

$MyWeb = Get-SPWeb http://MySite.com -AssignmentCollection $MyAssignment stTemplates["Custom List"])

ניצור את הרשימה, ניתן את שמה, התיאור והתבנית.

$MyWeb.Lists.Add("My List","This list created with powershell",$MyWeb.ListTemplates["Custom List"])

ניצור את השדה (במקרה זה Text)

$MyList = $MyWeb.Lists["My List"]

$MyList.Fields.Add("TextField","Text",$MyWeb.FieldTypeDefinitionCollecti on["Text"])

ולסיום נסגור את האתר ואת המשימה.

$MyWeb.Dispose()

Stop-SPAssignment $MyAssignment

עכשיו אם נבדוק באתר, נראה את הרשימה עם השדה שהוספנו

נחמד..
שבוע טוב,
רועי


04 December 2010

The request failed with HTTP status 401: Unauthorized

ב- SharePoint , ובכלל ב- asp.net אשר אני פונה לשרת נוסף ואני עובד ב-NTLM  ולא ב- Kerberos, אני אמור להעביר Credential. הבעיה מתחילה, כאשר הזמן לא מספיק, ואז מקבלים שגיאה, שבכלל אומרת שאין לי הרשאות לשרת, למרות שהעברתי את ה Credential.

The request failed with HTTP status 401: Unauthorized

יש שני פתרונות קלים:
האחד, להוסיף זמן ב- Web.Config - Timeout
השני והנכון יותר (לפי דעתי), זה לפנות בThread-  נוסף לשרת המרוחק.
הנה דוגמה לקוד שפונה ב- Thread נוסף. שימו לב, שהגדרתי DefaultCredentials לפני פתיחת ה- Thread.

WSrv.MyService wsrv = new MyService();
wsrv.Credentials = CredentialCache.DefaultCredentials;
System.Threading.Thread t = new System.Threading.Thread(delegate()
{
   resp = wsrv.CallMyWebService(prms);
});
t.Start();
t.Join();

לא מסובך, ועובד.
חג שמח,
רועי ק.

27 November 2010

Array of Arrays (Two Dimensional Arrays) in JavaScript

כאשר רוצים ליצור מערך של מערכים  ב JavaScriptזה בדר"כ נראה קוד מסובך, וקשה לתחזק אותו.
בניתי קוד שדומה לHash או Dictionary שיש לו Key והוא האיבר המצביע על המערך השני שהוא הValue.
פונים אליו בשני דרכים
הראשונה, כל פעם (בדרך כלל בלולאות) מוסיפים למערך ב SetAnItem:
var arr1 = new RoiArray();
arr1.SetAnItem("One",1);
arr1.SetAnItem("Two",1);
arr1.SetAnItem("Three",1);
השנייה, בו זמנית מכניסים את כל המערך:
var arr2 = new RoiArray("One",[1,1,1],"Two", "two", "Three",3);


למערך יש אפשרות להסיר מהרשימה (RemoveAnItem) על פי הKey, לבדוק שקיים Key מסוים (HasItem) וכמובן לקבל את הערך (GetAnItem) של המפתח.

הקוד של הJS:
function RoiArray()
{
  this.length = 0;
  this.items = new Array();
  for (var i = 0; i < arguments.length; i += 2) {
    if (typeof(arguments[i + 1]) != 'undefined') {
      this.items[arguments[i]] = arguments[i + 1];
      this.length++;     
    }
  }
  
  this.RemoveAnItem = function(in_key) 

  
      
    var tmp_value; 
    if (typeof(this.items[in_key]) != 'undefined') {
      this.length--;
      var tmp_value = this.items[in_key];
      delete this.items[in_key];
    }     
    return tmp_value; 

  
   
  this.GetAnItem =
function(in_key) {
    return this.items[in_key]; 
  }
  this.SetAnItem = function(in_key, in_value) {
    if (typeof(in_value) != 'undefined') {
      if (typeof(this.items[in_key]) == 'undefined') {
        this.length++;
      }
      this.items[in_key] = in_value;    
    } 
     
    return in_value; 

  
  
  this.HasItem = function(in_key) 
        
    return typeof(this.items[in_key]) != 'undefined'

  }
}
נחמד, לא?
שבוע טוב,
רועי

13 November 2010

How to add an Icon to Search View or WebPart View in SharePoint

איך מצגים את הicon ב webpart תצוגות או בחיפוש?



בפוסט הזה אדגים איך להוסיף את האיקון של PDF, כך שנוכל לראות אותו בתצוגות ובחיפוש.




שלב 1: נעתיק את הicon לספריה - למשל MyPdfIcon16.gif:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Images

שלב 2: נוסיף את הicon לקובץ Docicon.xml שנמצא ב:

C:\Program Files\Common Files\Microsoft Shared\Web server extensions\12\Template\Xml

נפתח בnotepad את הקובץ, נוסיף את השורה במקום המתאים (mapping) את השורה הבאה
<Mapping Key="pdf" Value="MyPdfIcon16.gif"/>

שלב אחרון: IISRESET

נחמד לא?

הסבר ניתן למצוא גם Microsoft support


נתראה,

רועי ק'

10 November 2010

The page took too long to save

מכירים את ההודעה באקספלורר 8
“Are you sure you want to navigate away from this page?

The page took too long to save. You can click "Cancel", and then try to save the page again. If you click "OK", you might lose unsaved data.

Press OK to continue, or Cancel to stay on the current page.”

או אם יש לכם IE בעברית
 
שמירת הדף נמשכה זמן רב מדי. באפשרותך ללחוץ על "ביטול" ולאחר מכן לנסות שוב לשמור את הדף. אם תלחץ על "אישור", ייתכן שתאבד נתונים שלא נשמרו.
 

כל מה שצריך לעשות זה לשנות הגדרה בExplorer.
 
Tools > Internet Options > Advanced
ולבטל את ה - "Enable native XMLHTTP support"
 

פשוט לא?
 
את הפתרון מצאתי בsadomovalex's blog
 
תודה,
רועי

06 November 2010

Create a new scope in SharePoint search

CScope בחיפוש זה טווח החיפוש. לדוגמה אני רוצה לחפש רק תמונות, רק מאתר מסוים וכדומה.

בפוסט זה אדגים איך ליצור scope שיהיה אפשר לחפש רק במסמכים כמו וורד.

בShared Service יש לגשת Search Administration בעמודת הMetadata Properties

נחפש את FileExtension, נלחץ על Edit

נסמן את FileExtension כAllow this property to be used in scopes

עכשיו נחזור לSearch Administration בעמודת הScopes


נלחץ על New Scope


נרשום את שמו Documents, נגדיר לו דף חיפוש חדש (זה לכשנרצה לשנות את הxsl של תוצאות החיפוש). ונלחץ אישור OK.


עכשיו נשים לב שליד הScope שלנו יש קישור Empty – Add rules. נלחץ עליו.


מכיוון שהגדרנו את FileExtension כסוג של Scope,  נסמן אותו בProperty Query. נסמן בBehavior את הscope כinclude.


עכשיו נגדיר את FileExtension כסיומת WORD כמו doc ו docx. ונלחץ אישור.


כדי להוסיף עוד FileExtension כל מה שנצטרך זה ללחוץ New rule


תהנו,
רועי

19 October 2010

Web Appliction Restore Error in SharePoint

נפלאות הם בעיות בMOSS .

כאשר ניסיתי לשחזר Web Appliction דרך הCentral Admin ב (Central Admin -> Operations ->Restore from backup)

זה מה שקיבלתי בתהליך האחרון (שלב 4)

Object WebAppName failed in event OnRestore. For more information, see the error log located in the backup directory. SPUpdatedConcurrencyException: An update conflict has occurred, and you must re-try this action. The object SPWebApplication Name=WebAppName Parent=SPWebService is being updated by USER, in the OWSTIMER process, on machine MACHINENAME. View the tracing log for more information about the conflict.

מה קורה פה? אי אפשר לעבור שחזור בלי בעיות.

נפלאות הם הפתרונות בMOSS .

כל מה שצריך לעשות זה:
  • לבטל את התזמון של השחזור (ללחוץ delete בTime Job Definition).
  • למחוק את הWeb Application החדש שנוצר.
  • ואז לבטל את הservice'ים של הSharePoint... כן, כן, לבטל את הservice'ים ב Services on server.
  • לבצע את השחזור שוב, ואז להחזיר את הservice'ים.

תהנו,
רועי קולבינגר

23 September 2010

SharePoint Time Zone

לפני כשבוע ישראל עברה לשעון חורף. שלא כמו שאר העולם, החוק בישראל להזזת השעון בנויי גם מהלוח שנה העברי וגם מהלוח שנה הגרגוריאני -האזרחי. פירסמתי בפוסט בתחילת השנה את לוח השנה ובו הימים המדוקים להחלפת השעון לשנה זו.

שעון קיץ (ישנים שעה פחות) עוברים בין חמישי לשישי ב2 לפנות בוקר אחרי ה1.04. זה בעצם היום השישי הראשון שמגיע אחרי הראשון באפריל. אבל גם בזה יש חריגים, אם פסח יוצא באותו זמן- כמו שקרה ב2009, אז מקדימים את העברת השעון שבוע קודם (ליום השישי בשבוע האחרון בחודש מרץ).

שעון חורף (ישנים עוד שעה) עוברים בין מוצאי שבת לראשון גם ב2 לפנות בוקר. אבל הפעם זה קורה במוצאי השבת שבין ראש השנה ליום כיפור.

הבעיה מתחילה ש- SharePoint לא מכיר טוב את הלוח שנה העברי. כדי לפתור בעיה זאת צריך לגשת ל
C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG
לחפש את הקובץ TIMEZONE.XML, לחפש את הזמן המקומי (הID של זמן ישראל-ירושלים הוא 27). לא לשכוח לגבות את הקוסץ לפני כל שינויי- ליתר ביטחון.

הקובץ XML פשוט להבנה כפי שמבטיחה מיקרוסופט.
בישראל אנו 120 דקות מינוס מקו גרינג'.
לכן אנחנו מגרים bias-120
month זה חודש שמתחלף השעון.
Hour זו השעה.
DayOfTheWeek - זה היום בו יתבצע בחלפת השעה.
והטריק הגדול של MOSS הוא השדה Day.
Day הוא השבוע של החודש בו מתבצע החילוף. כן, כן... תרגום של Day הוא שבוע.



הנה דוגמה לשנה זו (חורף 2010 וקיץ 2011):
 <Bias>-120</Bias>

<StandardTime>

<Bias>0</Bias>

<Date>

<Month>9</Month>

<Day>2</Day>

<Hour>2</Hour>

</Date>

</StandardTime>

<DaylightTime>

<Bias>-60</Bias>

<Date>

<Month>4</Month>

<Day>1</Day>

<Hour>2</Hour>

<DayOfWeek>6</DayOfWeek>

</Date>

</DaylightTime>

</TimeZone>

יש גם שדה היסטוריה History ששומר את ההגדרות של השנים הקודמות.

שתהיה שנה טובה,
רועי

09 September 2010

Add Css to a SharePoint WebPart

איך מוספים CSS לWebPart?
יש הרבה דרכים, אבל אני אדגים רק שתי דרכים נפוצות.
הראשונה הוספת הCSS בPreRender. יתרון משמעותי, בCSS נטען אחרון. זאת אומרת שאין קבצי core.css שעולים על הstyle'ים שלי (כי כמו שאתם יודעים בCSS האחרון הוא החזק והקובע).

       #region
-- Cntr --
///<summary>
   /// Cntr for MyWebPart
///</summary>

public MyWebPart()

{

this.PreRender += new EventHandler(WebPart_ClientCss_PreRender);

}

#endregion

///<summary>

/// Add css files to the page
/// </summary>
///<param name="sender"></param>

///<param name="e"></param>

private void WebPart_ClientCss_PreRender(object sender, System.EventArgs e)

{
const string cCSSControlID = "MyStyle";

// the resource path need absolute

if (Page.Header.FindControl(cCSSControlID) != null)

return;

String location = this.ClassResourcePath + "/styles.css";
// literal control css
LiteralControl literalControl = new LiteralControl(String.Format("<link
href='{0}' rel='stylesheet' type='text/css' />"
, location));


literalControl.ID = cCSSControlID;
Page.Header.Controls.Add(literalControl);
}

בעצם, מה שנעשה זה יצירת מתודה WebPart_ClientCss_PreRender שמתווסת לPreRender בזמן הContractor. בתוך המתודה מתבצע בדיקה שכבר לא קיים אותו CSS ואם לא קיים הוא יוסיף אותו.
הדרך השניה היא פשוטה יותר, קצרה יותר ומשתמשת בAPI של SharePoint – שזה יתרון חשוב. החיסרון שאנחנו לא שולטים מיקום הcss בheader (כדי לפתרון חסרון זה, כל מה שצריך לעשות זה להגדיר !important;).


protected
override void CreateChildControls()      
{

base.CreateChildControls();

// the resource path need relational

String location = this.ClassResourcePath.Replace(SPContext.Current.Site.Url,
string.Empty) + "/styles.css";

Microsoft.SharePoint.WebControls.CssRegistration.Register(location);
 
}
 
בדרך זו, אנו פונים למתודה שנקראת CssRegistration.Register ונותנים לה את הנתיב הרלציוני.
מקווה שלא סיבכתי יותר מדי את העינינים...
אה.. דרך אגב, אני מעדיף את הדרך השניה ...

רק דברים טובים,
רועי

30 August 2010

לוח שנה 2010-11 ה'תשע"א

הפעם לא הביא קוד ולגם סקריפט, אלה לוח שנה שבניתי ב- power-point.
בלוח שנה הזה אני הוספתי שקפים של תמונות (וכל אחד שיוסיף את התמונות שלו), וזו יכולה להיות אחלה מתנת חג.

לחצו כאן להורדת הקובץ

אז כולם ביחד..
בראש השנה, בראש השנה
פרחה שושנה אצלי בגינה
...
שתהיה שנה טובה,
רועי

20 August 2010

Upload form in infopath errors

 ישנו פתגם עממי שאומר "צרות באות בצרורות", זה בדיוק מה שקרה לי.


כאשר ניסיתי לעלות קובץ infopath הוא נכשל. לא יחסתי לזה חשיבות וניסיתי שוב. הפעם נסיתי לבצע Verify לפני וגם ה Verify נכשל. קובץ הלוג הראה את הצרה הבאה:

Microsoft.Office.InfoPath.Server.Converter.AspxDepthFirstWalkingVisitor.VisitChildControls(AspxControl control) at Microsoft.Office.InfoPath.Server.Converter.AspxDepthFirstWalkingVisitor.VisitDocument(AspxDocument document) at Microsoft.Office.InfoPath.Server.Converter.CssControlStateStylesVisitor.VisitDocument(AspxDocument document) at Microsoft.Office.InfoPath.Server.Converter.AspxDepthFirstWalkingVisitor.VisitControl(AspxControl control) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertBrowserSpecificView(Solution solution, ConverterDocument converterDocument, AspxDocument aspxDocument) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertView(Solution solution, ConverterDocument converterDocument) at Microsoft.Office.InfoPath.Server.Converter.SolutionConverter.ConvertSolution(Solution solution) at Microsoft.Office.InfoPath.Server.SolutionLifetime.Solution.<>c__DisplayClass2.b__0() at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock)

מה קשור CSS לזה שאי אפשר לעלות את הקובץ?
דבר ראשון שביצעתי זה לנקות כמה שאפשר את הקובץ מreference'ים. מסתבר זה קצת עזר.
עכשיו כאשר אני עשיתי Verify אני מקבל את ההודעות הבאות.


איזה יופי, אני מצליח לעשות Verify. עכשיו אני אעלה את הקובץ והכל יהיה בסדר...
אמרתי שצרות מגיעות בצרורות. עכשיו שאני העליתי את הקובץ קיבלתי את ההודעה הבאה:

The form template cannot be upgraded because the file name has changed since the previous version. Rename the file name to the following or change the form ID of the form template: blabla.xsn

שוב, לא יחסתי חשיבות להודעה השלישית ב Verify
אמרתי אין בעיה, קובץ : blabla.xsnקיים כבר, אז נמחוק אותו.



ראיתי שהקובץ נמצא בסטטוס deleting – אבל לנסות לא יזיק. לחצתי remove וזו ההודעה שקיבלתי.

A deployment or retraction is already under way for the solution "form-blabla-701.wsp", and only one deployment or retraction at a time is supported. at Microsoft.SharePoint.Administration.SPSolutionLanguagePack.CreateSolutionDeployTimerJob(DateTime dt, Collection`1 webApplications, SPSolutionDeploymentJobType jobType, Boolean globalInstallDlls, Boolean force)
at Microsoft.SharePoint.Administration.SPSolutionLanguagePack.Retract(DateTime dt)
at Microsoft.SharePoint.Administration.SPSolution.Retract(DateTime dt)
at Microsoft.Office.InfoPath.Server.Administration.FormTemplateCollection.<>c__DisplayClassa.b__8()
at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock)
at Microsoft.Office.Server.Diagnostics.ULS.SendWatsonOnExceptionTag(ULSTagID tagID, ULSCat categoryID, String output, Boolean fRethrowException, TryBlock tryBlock, CatchBlock catchBlock, FinallyBlock finallyBlock)
at Microsoft.Office.InfoPath.Server.Administration.FormTemplateCollection.Remove(FormTemplate formTemplate)
at Microsoft.Office.InfoPath.Server.Administration.FormTemplateCollection.RemoveFormTemplate(FormTemplate formTemplate)
at Microsoft.Office.InfoPath.Server.ApplicationPages.RemoveFormTemplatePage.<>c__DisplayClass2.b__0()
at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock)
at Microsoft.Office.Server.Diagnostics.ULS.SendWatsonOnExceptionTag(ULSTagID tagID, ULSCat categoryID, String output, Boolean fRethrowException, TryBlock tryBlock, CatchBlock catchBlock, FinallyBlock finallyBlock)
at Microsoft.Office.InfoPath.Server.ApplicationPages.RemoveFormTemplatePage.CommitData(Object sender, EventArgs e)
at Microsoft.Office.InfoPath.Server.ApplicationPages.FormTemplatePropertyPageBase.ButtonOkClick(Object sender, EventArgs e)
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint))

אוקי, איך אני מוחק את זה? כדי למחוק צריך לגשת ל Timer Job Definitions

Central Admin -> Operations Tab -> Timer Job Definitions


לבחור את הJOB הנכון ללחוץ עליו ולחוץ delete



עכשיו נפנה לstsadm.
כדי לדעת מהו ID הכון של התבנית נלחץ על
stsadm -o enumformtemplates
עכשיו נקבל רשימה של כל התבניות
העתקתי את הID
כמו הדוגמה מודגשת

blabla-myXSD-2010-03-2508-17-06 urn:schemas-microsoft-com:office:infopath:blabla-myXSD-2010-03-2508-17-06

עכשיו כדי למחוק נרשום את הפקודה

stsadm -o removeformtemplate –formid “MyFormid”

כאשר MyFormid הוא הID שראינו קודם.

עכשיו שעשיתי Verify לא קיבתי את ההודעה.

בשמחה, נגשתי לעלות את התבנית.
והצרה הבאה באה...
קבלתי שהודעה על Timeout.

מה? הקובץ עד כדי כך גדול? – מסתבר שכן.

עכשיו נגשתי ל IIS(במקרה שלי 7 IIS), פניתי לapplication pool של ה Central Adminלחצתי מצד ימין על Advanced Setting ושם שיניתי את בברירת החדל מ120 ל600 בconnection time out.



 עכשיו נגשתי לweb.config של Central Admin וגם שם הגדרתי את הexecutionTimeout.

 עכשיו התג httpRuntime נראה אצלי כך

httpRuntime executionTimeout="999999" maxRequestLength="51200 "

 אחרי כל זה, שוב ניסתי לעלות את התבנית ו...יש הצלחתי


 לסיום כתב המשורר יורם טהרלב בשירו הידוע "בים בם בום" ישנן צרות גדולות יותר, אז שנתראה רק בדברים טובים...

 רועי קולבינגר

13 August 2010

Asp.Net TreeView on the client side events - JavaScript

If you wanted to use System.Web.UI.WebControls.TreeView, Did you notice that it
works only on server side?
How can I add a css style to a node?
How Ican I add JavaScript to the TreeView.


It's a trick.
You need to inherit System.Web.UI.WebControls.TreeView and System.Web.UI.WebControls.TreeNode
and create two new classes.
On the TreeNode you need to build
1. Constructors based on the base constructors.
2.  Build the new properties (line onclick,
Style, Etc.)
3. Override two methods: RenderPreText and RenderPostText
Here is a simple code for the new class TreeNode:

    public class MyTreeNode : TreeNode
    {
        #region
-- Constructors --
   
public
MyTreeNode() : base() { }
public MyTreeNode(string Text) : base(Text) { }
public MyTreeNode(string Text,
string
Value) : base(Text, Value){ }
     
public
MyTreeNode(System.Web.UI.WebControls.TreeView
owner, bool isRoot) :
base(owner, isRoot) { }
public
MyTreeNode(string Text,
string
Value, string ImageUrl) :
base(Text, Value, ImageUrl) { }
public
MyTreeNode(string Text, string Value, string ImageUrl,
string
navUrl, string target):
base(Text, Value, ImageUrl, navUrl, target) { }
        #endregion
        #region -- Properties --
private string _cssClass;
public string My_CssClass
        {
            get { return _cssClass;}
            set { _cssClass = value;}
        }
private
string _onClick;
public string My_OnClickClient
        {
            get { return _onClick;}
            set { _onClick = value;}
        }
private string _style;
public string My_Style
        {
            get { return _style;}
            set { _style = value;}
        }
private string _clientId;
   
public string My_ClientId

        {
            get { return _clientId;}
            set { _clientId = value;}
        }
private string _clientName;
public string My_ClientName
        {
            get { return _clientName;}
            set { _clientName = value; }
        }
private string _onmouseover;
public string My_Onmouseover
        {
            get { return _onmouseover;}
            set { _onmouseover = value;}
        }
        #endregion
        #region -- Overrides --
protected override void RenderPreText(HtmlTextWriter writer)
        {
            writer.AddAttribute(
              HtmlTextWriterAttribute.Class, My_CssClass);
            writer.AddAttribute(
              HtmlTextWriterAttribute.Onclick, My_OnClickClient);
            writer.AddAttribute(
              HtmlTextWriterAttribute.Style, My_Style);
            writer.AddAttribute(
              HtmlTextWriterAttribute.Id, My_ClientId);
            writer.AddAttribute(
       HtmlTextWriterAttribute.Name,My_ClientName);
            writer.AddAttribute("onmouseover", My_Onmouseover);
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            base.RenderPreText(writer);
        }
       
protected
override void RenderPostText(HtmlTextWriter writer)
        {
            writer.RenderEndTag();
            base.RenderPostText(writer);
        }
        #endregion
    }

Now you have to change the TreeView that will work with your TreeNode.
All you need is to build a constructor that reads your TreeNode
Here is a simple code

public
class MyTreeView : System.Web.UI.WebControls.TreeView
    {   
protected
override TreeNode CreateNode()
        {
            return new MyTreeNode(this, false);
        }
    }
Now you have your properties on all nodes that you have, like

Code example:

MyTreeNode
  node = new MyTreeNode(Text, ID, ImageUrl, .NavigateUrl,, "");
node.My_CssClass = "MyNode";
node.My_ClientId = "MyNode";


That all,
Roi Kolbinger