Thursday, February 21, 2013

DataTable to TreeView in C#, Displaying Hierarchies

1 comment:
In this article I will show you how to display hierarchies in a TreeView control, when your data is in a DataTable. In this example we have an Employee table with 3 columns: ID, ParentID and Name.
ParentID is the ID of the boss for the current Employee.

The first step is to sort the table by the ParentID. This step is really important because we cannot insert a node in the tree until it's parent is not inserted. Notice the root of the tree having a ParentID of -1.

Here is the code for this:

The second step is to use a XmlDocument. The TreeView control does not have the functionality to find an arbitrary node given a node ID. A recursive find function seems to be too much hassle, not to mention the performance, so I decided to take advantage of the XPath search capabilities of XmlDocument to find a given Parent node.

Here is the code for this:

The third step is to hook up our data to the TreeView. If you try to bind the TreeView control to an XmlDocument you will get this error: HierarchicalDataBoundControl only accepts data sources that implement IHierarchicalDataSource or IHierarchicalEnumerable. To resolve this we can use an XmlDataSource control.

Here is the code for this:

Done. I hope that my little guide helped you in a way.
Your comments are welcomed.
Happy coding :)
Read More

Tuesday, January 22, 2013

Sanitizer provider is not configured in the web.config file. Ajax Control Toolkit and HtmlEditorExtender problems.

The Problem

Today I had a hard 2 hours, and if you have found this blog post, I bet we are in the same shoes.
I was working on a ASP .NET + windows azure project, and I needed the HtmlEditorExtender  control from the Ajax Control Toolkit. I was lucky to find a control for my needs. So far so good.
I've installed the toolkit with NuGet Package manager, it added a reference to the assembly to my web.config. I've used the following code where I needed the HtmlEditorExtender:

<ajaxToolkit:ToolkitScriptManager runat="Server" />
        runat="server" /> 
        runat="server" />

Just to see how this control works. As you can bet ajaxToolkit is the reference to the assembly.
I've hit F5 and bam this uglyness showed up:


I've tried to search on the codeplex site of the project, but nothing was mentioned about this.
Just use it as it is. Yeah, right! I've searched on google about this problem,
and what I've found were mostly outdated blogs, sites, stackoverflow topics.
On the site of the project I've found this web.config file: 

  <sectionGroup name="system.web">
 <section name="sanitizer" 
 <compilation targetFramework="4.0" debug="true"/>
 <sanitizer defaultProvider="AntiXssSanitizerProvider">
   <add name="AntiXssSanitizerProvider" 

It was similar to the web.config files found on stackoverflow, and IIS was complaining about not finding the AjaxControlToolkit assembly.
After many searches I've found this response on stackoverflow:
"Using AntiXss as the default sanitizer is no longer supported as of June 2012.
From the official announcement, apparantely the new version of AntiXss breaks too many things.".
Oh great! and were was this specified on the ?
People don't use the blog of a developer to look for information about a project,
they use the main page of the project, that is the purpose of it, to find out why their
code is not working. And I don't need to mention that the Issue tracker had no
useful information about this.

The solution was to install HTML Agility Pack NuGet package. And make modifications to
the web.config, something like this:

    <sectionGroup name="system.web">
      <section name="sanitizer" requirePermission="false"
               type="AjaxControlToolkit.Sanitizer.ProviderSanitizerSection, AjaxControlToolkit" />
    <sanitizer defaultProvider="HtmlAgilityPackSanitizerProvider">
        <add name="HtmlAgilityPackSanitizerProvider" type="AjaxControlToolkit.Sanitizer.HtmlAgilityPackSanitizerProvider"></add>

Don't worry about the warning from VS about: "The element system.web has invalid child element..." it will work just fine.

Well, this is it. It is very hard to keep existing documentation up to date, as these technologies change every day, but at least they could made a list of things to keep in mind, to not let situations like this to happen. Nothing is worse than the lack of information when you are facing a problem.
I hope that you have found the solution to your problem in this post.
If you have any questions, suggestions or anything to say, you are welcome to post them as comments.
Until the next time, happy coding :)
Enhanced by Zemanta
Read More

Friday, May 11, 2012

My android phone keeps restarting

No comments:
Some days ago my android phone kept restarting, and heating up.
I have a Samsung Galaxy S2 GT-I9100,
kernel: XWLP7
OS: ICS 4.0.3

Ok, I said, probably the latest apps that I've installed on it have to do something with this, I tried to uninstall them, but no luck. Then I thought I have a virus, but how can I scan my phone if it keeps restarting.
As a last resort I tried to move my apps from my SD memory card to the phones internal memory, guess what ? the restarting stopped and the heat up too.

After some google-ing I've found this:
They say that this is a bug in ANDROID OS 2.3.5 (and higher), and happens if you have too many apps transferred to your SD card.
Huge bug my ass, this is lame. How come that it was not fixed in the further updates? This is not a small bug that happens once a year, this can be recreated over 1000 times, with the same result. It's a shame.

So, if you have the same issue as me, just try out my solution, and tell me if it worked for you.
Read More

Saturday, February 05, 2011

SEO pentru Blogger, Adaugare de meta tag-uri

1 comment:
Cele mai des folosite meta tag-uri pentru SEO, pentru un blog pe platforma Blogger sunt: description si keywords.
Blogger nu foloseste in mod implicit aceste meta tag-uri.
Inainte sa faci vre-o modificare la template-ul tau, fa un backup ca sa nu ai dureri de cap.
Pentru implementarea metodelor de mai jos, cauta in codul template-ului tau urmatoarea secventa de cod:

<b:include data="blog" name="all-head-content">

Sub el adauga meta tag-urile cu una dintre metodele descrise mai jos.

Metoda 1
Adaugi meta tag-urile ca si pentru o pagina web normala.

<meta content='Cuvinte cheie separate prin virgula'  name='keywords'/>;
<meta content='Descrierea blogului'  name='description'/>

Pro:- din doua linii de cod ai meta description si keyword pentru tot blogul
- o solutie mai comoda
- description si keyword duplicat pe toate paginile blogului
- Google si alte motoare de cautare te vor penaliza pentru continut duplicat

Metoda 2
Adaugi niste conditii if, pentru fiecare pagina in parte.

<b:if cond="data:blog.url == &quot;;">
<meta content='descriere' name='description'/>
<meta content='cuvinte cheie' name='keywords'/></b:if>
<b:if cond="data:blog.url == &quot;;">
<meta content='tu la ce folosesti internetul?' name='description'/>
<meta content='folosire internet' name='keywords'/></b:if>

Pro:- se pot adauga meta tag-uri pentru fiecare pagina
- nu vei avea meta tag-uri duplicate
- daca ai foarte multe postari pe blog, te poate lua ceva timp pana scrii pentru toate
- este foarte greu de facut, trebuie sa fii atent sa nu gresesti

Folosirea acestei metode se poate usura, daca numai pentru pagina principala adaugi meta tag-uri si pentru posturile importante sau la care vrei sa ai meta tag-uri.

Metoda 3
Adaugi meta tag-uri doar la pagina principala.

<meta content='cuvinte cheie' name='keywords'/>
<b:if cond="data:blog.pageType == &quot;index&quot;">
<meta content='descriere' name='description'/>

Pro:- nu vei avea meta tag-uri duplicate
- doar pentru pagina principala vei avea meta tag-uri

Metoda 4
Adaugi niste conditii if, pentru ca titlul articolului(postului) + cuvinte cheie alese de tine sa fie meta description si meta keyword pentru posturile tale.
<b:if cond="data:blog.url == data:blog.homepageUrl">   <meta content='descriere' name='description'/>   <meta content='cuvinte cheie' name='keywords'/>
<b:if cond="data:blog.pageType == &quot;item&quot;">
<meta expr:content='data:blog.pageName' name='Description'/>
<meta expr:content='data:blog.pageName + ", alte cuvinte cheie pentru blog "' name='keywords'/>

Pro:- usor de folosit
- nu trebuie sa adaugi meta tag-uri pentru fiecare post
- scapi de meta tag-uri duplicate
- titlul postului va fi descrierea si keyword-ul pentru un articol
- Google te va atentiona ca la unele pagini ai descrierea scurta


Fiecare metoda se poate folosi in functie de situatie si de nevoi. Eu ti-am prezentat metodele pe care le cunosc plus niste argumente pro si contra pentru fiecare.
In foarte multe articole SEO de pe internet se scrie ca Google si Bing ignora complet meta tag-ul keyword, doar Yahoo il mai ia in considerare.
Google de multe ori foloseste snippet-uri si ignora complet meta description-ul, astfel munca depusa in scrierea ei se duce de rapa.
Tu ce meta tag-uri folosesti? Merita sau nu, sa pui meta tag-uri?

Enhanced by Zemanta
Read More

Wednesday, January 26, 2011

14 Sfaturi pentru programatori incepatori


Am petrecut foarte mult timp cu depanarea codurilor scrise de mine sau de altii. Nu conteaza despre ce limbaj de programare este vorba: C, C++, C#, Java, PHP, HTML, CSS, ASP, etc. Pana la urma cel mai mult timp il vei pentrece cu depanarea codului pe care il scrii, sau scris de altii.
         In aceasta ordine de idei am elaborat 14 sfaturi pentru programatori incepatori:
  1. Rabdare. Depanarea necesita foarte multa rabdare. Trebuie sa ai o gandire calma si rationala, cu cat te enervezi mai mult cu atat scade sansa de a reusi sa-ti repari codul. 
  2. Google este prietenul tau. Foarte multi oameni care au invatat sa programeze au avut aceleasi probleme ca si tine. Poti gasi solutia la problema pe care o ai, sau alte solutii pe care trebuie sa le adaptezi pentru problema ta, si cum se foloseste functia sau clasa de care ai nevoie. Pe internet sunt foarte multe detalii despre functia sau clasa pe care vrei s-o folosesti, doar trebuie sa cauti.
  3. Citeste mesajele de eroare Foarte multi incepatori ignora mesajele de eroare date de catre compilator. Regula de aur, incearca sa depanezi prima eroare, recompileaza si treci la urmatoare eroare. Un exemplu bun este can in C sau C++ gresesti sau scrii gresit in portiunea de #include si apar zeci de erori, cum ai corectat greseala, numarul de mesaje de eroare se reduce considerabil. Daca nu intelegi mesajul de eroare, cautal pe google.
  4. Ce declari si de ce? Fii atent la variabilele tale. De ce variabile ai nevoie ? Ce fac ele ? Tipul variabilei(intr, string, bool, etc) este foarte important.
  5. Scrie cod care nu are nevoie de comentarii prea multe. Daca folosesti nume de variabile, functii si clase, criptate atunci "tai creanga de sub tine". Trebuie sa dai nume descriptive ca sa-ti intelegi codul si sa-l poti depana mai usor. Exemplu: variabila - numarPrim, primaLitera, etc; functie - lungimeVector, numarMaxVector, etc; clasa - Lista, Coada, etc. Poti folosi linistit variabile de contor ca si i, j, etc in for-uri, pentru ca se subantelege, dar nu folosi niciodata x, y, a, b, etc la variabilele care reprezinta un lucru. Nu fii lenes sa scrii, nu folosi prescurtari care sunt rar folosite, nu-ti vei aminti semnificatia lor.
  6. Afiseaza valorile! Este foarte util sa vezi ce se intampla in interiorul codului, nu-ti fie teama sa le folosesti, le poti comenta sau sterge pe urma. Daca nu ai un compilator in care poti urmari valoarea variabilelor in timpul rularii pas cu pas sau programezi intr-un limbaj de scripting(eg. php, python, etc) esti dependent de aceasta tehnica de depanare.
  7. Lucruri mici pot crea probleme mari. De multe ori am patit sa ma uit ore intregi la un cod si sa nu-mi dau seama de ce nu face ce ar trebui sa faca. Problema ? am folosit simbolul de atribuire(=) in locul simbolului pentru comparare(==) intr-un if(greaseala des intalnita in C). Deosebirile mici pot avea impacturi mari, fii foarte atent la ele.
  8. Foloseste pixul si hartia. De multe ori crezi ca stii rezolva problema din prima si de apuci de codat, dar dupa un timp scurt iti dai seama ca te-ai blocat si nu mai stii face mai departe. Ia o foaie si un pix, rezolva problema in pseudocod, sau daca nu-ti place pseudo codul, scrie cu cuvintele tale pasii.
  9. Calculatorul face exact ce-i spui, in ordinea in care i-o spui. Foarte multi uita de acest lucru important. Cand calculatorul nu face ce vrei, atunci amintesteti de acest lucru. Este foarte important ca sa fie clar ce sa se execute prima data, sau ce sa se repete sau nu, intr-o bucla de exemplu.
  10. Daca este un profesor sau un prieten care te poate ajuta, profita de el!
  11. Reduntanta. Daca observi ca scrii aproape acelsi cod de mai multe ori, incearca sa-l implementezi intr-o functie, astfel vei reduce lungimea codului pe care il scrii si depanarea acestuia va fi mult mai usor.
  12. Ruleaza, Ruleaza, Ruleaza! Sunt foarte multi care fac greseala de a scrie zeci sau chiar sute de randuri de cod fara de al rula. Dupa ce scrii o bucatica de cod, ruleazal; sau scrii o functie, folosestel vezi daca face ceea ce trebuie sau returneaza valoarea care trebuie.
  13. Nu-ti fie rusine sa intrebi. Nu ne-am nascut atot stiutori, daca nu stii ceva sau nu intelegi ceva, intreaba pe cineva, intreaba pe forumuri, pe un blog, pe yahoo answears, numai intreaba.
  14. Programeaza cu dragoste! Programare, invatare, iubire, blogging sau orice altceva nu se poate face cu forta! Daca nu ai dragoste pentru ceea ce faci, mai bine apucate de altceva care iti place.
Daca ai un sfat pentru programatori incepatori, intrebare, sau opinie scrie un comentariu.
Read More

Tuesday, January 11, 2011

Tutorial C# - Cum sa faci un program care citeste text cu voce

1 comment:
In acest tutorial C# o sa va arat cum sa folositi Speech API-ul de la Microsoft.

Pasul 1

Adaugati o referinta la obiectul SAPI COM. In Solution Explorer din Visual Studio da-ti click dreapta pe folderul References si selectati Add Reference. In fereastra ce apare, selectati tab-ul COM si dati click pe Microsoft Speech Object Library si apasati pe OK.

In imaginea mai jos puteti vedea cum arata interfata, contine 1 TextBox cu proprietatea MultiLine - True si un Button.

Dati dubliclick pe buton pentru a crea un event petru acesta.
        SpeechLib.SpVoiceClass voice = new SpVoiceClass();
        private void button1_Click(object sender, EventArgs e)
            voice.Speak(textBox1.Text, SpeechLib.SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak);

Jucati-va putin cu obiectul voice, se poate schimba volumul, vocea etc.Daca apar probleme cu codul, sau ati facut ceva intreasant cu API-ul, nu ezitati sa scrieti un comentariu.
Enhanced by Zemanta
Read More

Sunday, January 09, 2011

Tutorial C# - Cum sa aduni doua valori din doua TextBoxuri

No comments:
In acest mic tutorial de C# va voi prezenta cum se pot aduna doua valori introduse in TexBox-uri, iar rezultatul sa fie afisat intr-un label, dupa apasarea unui buton.

Creati un nou project visual in Microsoft Visual C# 2010 Express sau oricare versiune in care puteti folosi C#. Pe noua forma puneti 2 TextBoxu-ri, 1 Button si 1 Label.
Vedeti in imaginea de mai jos.
Selectati label-ul si stergeti textul din proprietatea text al acestuia.
Da-ti dublu click pe button1 ca sa creati un event pentru acesta.
        //aceasta metoda se va executa dupa apasarea butonului     
        private void button1_Click(object sender, EventArgs e)
            //prin textBox1.Text si textBox2.Text se aceseaza proprietatea Text         
            //de tip string al TextBox-urilor        
            //metoda int.Parse() converteste string in int          
            int valoare1 = int.Parse(textBox1.Text);
            int valoare2 = int.Parse(textBox2.Text);
            int suma = valoare1 + valoare2; //se sumbantelege :)         
            //proprietatea Text al lui label1 este egal cu textul returnat de          
            //catre suma.ToString()         
            label1.Text = suma.ToString();

Programul face tot ce trebuie.
Este o mica scapare pe care intentionat am lasat-o in program, daca o gasiti nu ezitati sa postati un comentariu ;)
Enhanced by Zemanta
Read More