<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Vlatkovic.NET - Programiranje|asp.net</title>
    <link>http://www.vlatkovic.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Predrag Vlatković</copyright>
    <lastBuildDate>Tue, 15 Jan 2008 22:41:27 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>info@vlatkovic.net</managingEditor>
    <webMaster>info@vlatkovic.net</webMaster>
    <item>
      <trackback:ping>http://www.vlatkovic.net/Trackback.aspx?guid=28414adb-3fad-487c-a3b0-c32c1566b796</trackback:ping>
      <pingback:server>http://www.vlatkovic.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.vlatkovic.net/PermaLink,guid,28414adb-3fad-487c-a3b0-c32c1566b796.aspx</pingback:target>
      <dc:creator>Peca Vlatković</dc:creator>
      <wfw:comment>http://www.vlatkovic.net/CommentView,guid,28414adb-3fad-487c-a3b0-c32c1566b796.aspx</wfw:comment>
      <wfw:commentRss>http://www.vlatkovic.net/SyndicationService.asmx/GetEntryCommentsRss?guid=28414adb-3fad-487c-a3b0-c32c1566b796</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <h5>I opet malo programiranja, ovog puta o proširivanju postojećih asp.net severskih
kontrola na primeru GridView-a. 
</h5>
        <p>
Cilj ovog teksta je da pokaže kako se postojeće ASP.NET serverske kontrole mogu relativno
lako dograditi tako da im se poveća funkcionalnost. Kao primer sam uzeo GridView koji
u osnovnoj postavi nema  multiselect ali uz malo dorade postaje vrlo sličan gridovima
koje srećemo u windows programiranju. Ideja je da možemo da izaberemo više redova
u GridView tako što ćemo prilikom izbora držati taster CTRL. 
</p>
        <p>
Realizacija je sledeća: kad god kliknemo na neki red u GridView kontroli izvrši se
registracija tog klika i nakon postback-a se čitaju indeksi kliknutih redova na osnovu
kojih vraćamo redove u kontroli koji su izabrani. 
</p>
        <p>
Prvi korak je da kreiramo novu klasu koja će predstavljati DataGrid sa multiselect
opcijom. Ona će biti izvedena iz  System.Web.UI.WebControls.GridView klase i
čime obezbeđujemo nasleđivanje svih osobina i metoda ove klase na koje smo navikli. 
</p>
        <p>
public class MultiSelectGridView : System.Web.UI.WebControls.GridView
</p>
        <p>
Zatim je potrebno da na svaki red koji generiše osnovna  GridView klasa “zalepimo”
onclick javascript događaj (event handler). To radimo tako što promenimo OnRowDataBound
metodu iz osnovne klase. 
</p>
        <p>
1: protected override void OnRowDataBound(GridViewRowEventArgs e)<br />
2:  {<br />
3:   base.OnRowDataBound(e);<br />
4:<br />
5:   if (e.Row.DataItem != null)<br />
6:   {<br />
7:    e.Row.Attributes.Add("OnClick", "msel(event)");<br />
8:<br />
9:    _id = this.PageIndex + "." + e.Row.RowIndex.ToString();<br />
10:    e.Row.Attributes.Add("index", _id);<br />
11:   }<br />
12:  }
</p>
        <p>
Glavna stvar se nalazi u liniji 7, gde na Row element dodajemo atribut OnClick koji
će izvršavati msel(event) javascript funkciju na svaki klik. Javascript funkcija msel
registruje gde se izvršio click događaj i upisuje indeks kliknutog elementa u skriveno
(hidden) polje čiju vrednost ćemo kasnije, u postback-u, da parsiramo. Ovu funkciju
ćemo da kreiramo i registrujemo kasnije.<br />
Sledeća stvar se nalazi na linijama 9 i 10. Naime, tu kreiramo indeks elementa koji
je kliknut i vezujemo ga za sam element. Njegova konstrukcija je vrlo jednostavna,
“_id = broj stranice + tačka + indeks trenutnog reda”. Dobijeni indeks se upisuje
kao dodatni atribut u element koji predstavlja red u GridView-u.<br />
Da bi na klijentskoj strani znali koji red je izabran kreiramo Javascript funkciju
“msel“ koju ćemo kasije da registrujemo na strani (podvučeni delovi code-a se automatski
generišu u runtime-u).
</p>
        <p>
Pre nego što prokomentarišem javascript code, da kažem par reči o html code-u koji
generiše standardni GridView. GridView je u stvari obična tabela tj &lt;table&gt;&lt;tr&gt;&lt;td&gt;...
konstrukcija. &lt;tr&gt; tag predstavlja red u našoj kontroli (Row) i na njega se
“lepi” OnClick event. Sam event se zapravo okida na &lt;td&gt; elementu ali se propagira
do prvog roditeljskog (parent) elementa koji ima handler tj definisan onclick a to
je &lt;tr&gt; element. I evo javascript-a koji se generiše.<br />
Da prokomentarišemo javascript.
</p>
        <p>
1:&lt;script language="javascript"&gt;<br />
2: function msel(e, o)<br />
3: {
</p>
        <p>
kreiramo referencu na skriveni (hidden) html element koji u sebi sadrži informacije
koji redovi su selektovani
</p>
        <p>
4:  var selected = document.getElementById(o); 
</p>
        <p>
Zatim kreiramo referencu prema Event-u koji je inicirao izvršenje funkcije. Ova referenca
nam treba da bi saznali koji je objekat inicirao Event i da li je pri kliku bio pritisnut
taster CTRL. Linija 6 daje neposredni objekat koji je inicirao event, u ovom slučaju
&lt;td&gt; tj ćeliju koja se nalazi unutar &lt;tr&gt; elementa. Na liniji 7 hvatamo
sam &lt;tr&gt; element koji nosi informaciju o tome koji je indeks kliknutog elementa.
</p>
        <p>
5:  e = e ? e : ((window.event) ? event : null);<br />
6:  var obj = e.target ? e.target : ((e.srcElement) ? e.srcElement : null);<br />
7:  obj = obj.parentElement ? obj.parentElement : obj.parentNode;<br />
8:  var objParent = obj.parentElement ? obj.parentElement : obj.parentNode;
</p>
        <p>
Na linijama 9 i 10  kreiramo objekte String tipa koji redom nose podatke o izabranim
redovima i o trenutno kliknutom objektu tj njegovom indeksu. 
</p>
        <p>
9:  var sel = new String(selected.value);<br />
10:  var id = new String(obj.getAttribute("index"));<br />
11:  var cssclass;<br />
12:  
</p>
        <p>
Linija 13 ispituje da li je prilikom klika bio pritisnut i taster CTRL. Ukoliko jeste
na liniji 14 proveravamo da li je red već izabran. Ukoliko jeste, ukloni ga iz liste
izabranih i promeni css klasu za tekuću liniju. U suprotnom ubaci ga na listu izabranih
i promeni css klasu.
</p>
        <p>
13:  if (e.ctrlKey) {<br />
14:   if (sel.indexOf("-" + id + "-") &gt; -1) {<br />
15:    selected.value = sel.replace("-" + id + "-", "");<br />
16:    obj.className = "CssClassRow";<br />
17:   }<br />
18:   else {<br />
19:    selected.value = sel + "-" + id + "-"; 
<br />
20:    obj.className = "CssClassRowSelected";<br />
21:   } 
<br />
22:  } 
</p>
        <p>
Ukoliko CTRL nije pritisnut (linija 23) lista izabranih indeksa svodi se na trenutno
izabran a css klase se menjaju tako da su svi objekti neselektovani.  
</p>
        <p>
23:  else { 
<br />
24:   if (sel.indexOf("-" + id + "-") &gt; -1) { 
<br />
25:    cssclass = "CssClassRow"; selected.value = ""; 
<br />
26:   } 
<br />
27:   else { 
<br />
28v    cssclass = "CssClassRowSelected"; 
<br />
29:    selected.value = "-" + id + "-"; 
<br />
30:   } 
<br />
31:   var trs = objParent.getElementsByTagName("tr");<br />
32:   for(i = 0; i &lt; trs.length; i++) 
<br />
33:    if (trs[i].getAttribute("index"))<br />
34:     trs[i].className = "CssClassRow";obj.className =
cssclass;<br />
35:    } 
<br />
36:  } 
</p>
        <p>
 Napomena: podvučeni delovi se generišu
</p>
        <p>
Funkcija  disableSelection samo ne dozvoljava da se na kliknutim redovima izvrši
selekcija teksta. Za detalje pogledajte <a href="http://www.dynamicdrive.com/dynamicindex9/noselect.htm">http://www.dynamicdrive.com/dynamicindex9/noselect.htm</a>. 
</p>
        <p>
37: function disableSelection(target) {  <br />
38:  if (typeof target.onselectstart!="undefined")   <br />
39:   target.onselectstart=function(){return false;};  <br />
40:  else if (typeof target.style.MozUserSelect!="undefined")    <br />
41:   target.style.MozUserSelect="none";   <br />
42:  else   <br />
43:   target.onmousedown=function(){return false;};  <br />
44:  target.style.cursor = "default"; 
<br />
45: } 
<br />
46:&lt;/script&gt;
</p>
        <p>
          <br />
Ok, sledeća metoda koju menjamo u odnosu na originalnu GridView klasu je OnRowCreated. 
</p>
        <p>
1:protected override void OnRowCreated(GridViewRowEventArgs e)<br />
2:{<br />
3: base.OnRowCreated(e);<br />
4:<br />
5: _id = this.PageIndex + "." + e.Row.RowIndex.ToString();<br />
6:<br />
7: if (selected != null &amp;&amp; selected.IndexOf("-" + _id + "-") &gt; -1)<br />
8:     e.Row.CssClass = CssClassRowSelected;<br />
9: else<br />
10:     e.Row.CssClass = CssClassRow;<br />
11:}
</p>
        <p>
Opet kreiramo indeks, linija 5, i ako je trenutni red u listi selektovanih onda mu
menjamo css klasu. 
</p>
        <p>
I na kraju menjamo CreateChildcontrols metodu. Zapravo samo je proširujemo. Cilj je
da između svakog postback-a očuvamo stanje selektovanih redova. 
</p>
        <p>
1:protected override void CreateChildControls()<br />
2:{
</p>
        <p>
Naravno pustimo da se kreiraju sve potrebne kontrole koje se kreiraju za GridView
(Linija 3)
</p>
        <p>
3: base.CreateChildControls();<br />
4:<br />
5: string[] selectedArray;<br />
6:<br />
7: if (!string.IsNullOrEmpty(selected))<br />
8: {
</p>
        <p>
Izdvojimo indekse redova selektovanih na client strani (linija 9.) .
</p>
        <p>
9:  selectedArray = selected.Split('-');<br />
10:
</p>
        <p>
Kreiramo listu int vrednosti koja će sadržati indekse izabranih redova.
</p>
        <p>
11:  SelectedIndexs = new List&lt;int&gt;();
</p>
        <p>
Kreiramo string niz koji će u sebi sadržati tekuću stranu i tekući index na strani.
</p>
        <p>
12:  string[] pageAndIndex;
</p>
        <p>
Za svaki element u selectedArray a na osnovu stranice i indeksa preračunamo pravi
indeks i ubacimo u  SelectedIndexs.
</p>
        <p>
13:  foreach (string s in selectedArray)<br />
14:  {<br />
15:   if (s.Length &gt; 0)<br />
16:   {<br />
17:    pageAndIndex = s.Split('.');<br />
18:    SelectedIndexs.Add(int.Parse(pageAndIndex[0]) * this.PageSize
+ int.Parse(pageAndIndex[1]));<br />
19:   }<br />
20:  }<br />
21: }<br />
22:
</p>
        <p>
Registrujemo skriveno html polje u koje upisujemo koji su izabrani redovi.
</p>
        <p>
23: this.Page.ClientScript.RegisterHiddenField(selectedKey, selected);
</p>
        <p>
Registrujemo blok sa javascript funkcijama opisanim gore.
</p>
        <p>
24: this.Page.ClientScript.RegisterClientScriptBlock( ( (System.Web.UI.WebControls.GridView)this).GetType(),
"MultiselectGridView_js", js);<br />
25:
</p>
        <p>
I na kraju na GridView kontrolu dodamo još jednu literal kontrolu koja u sebi sadrži
poziv funkcije  disableSelection koja ne dozvoljava da se selektuje tekst na
upravo kreiranoj kontroli.
</p>
        <p>
26: Literal l = new Literal();<br />
27: l.Text = "&lt;script language=\"javacript\" type=\"text/javascript\"&gt;disableSelection(document.getElementById(\""
+ this.ClientID + "\"));&lt;/script&gt;";<br />
28: this.Controls.Add(l);<br />
29:}
</p>
        <p>
I to je to, kompletan code možete da skinete <a href="http://www.vlatkovic.net/download/GridView_na_kvadrat.zip">ovde</a>.
</p>
        <img width="0" height="0" src="http://www.vlatkovic.net/aggbug.ashx?id=28414adb-3fad-487c-a3b0-c32c1566b796" />
      </body>
      <title>GridView na kvadrat -  multiselect</title>
      <guid isPermaLink="false">http://www.vlatkovic.net/PermaLink,guid,28414adb-3fad-487c-a3b0-c32c1566b796.aspx</guid>
      <link>http://www.vlatkovic.net/2008/01/15/GridView+Na+Kvadrat+Multiselect.aspx</link>
      <pubDate>Tue, 15 Jan 2008 22:41:27 GMT</pubDate>
      <description>&lt;h5&gt;I opet malo programiranja, ovog puta o proširivanju postojećih asp.net severskih
kontrola na primeru GridView-a. 
&lt;/h5&gt;
&lt;p&gt;
Cilj ovog teksta je da pokaže kako se postojeće ASP.NET serverske kontrole mogu relativno
lako dograditi tako da im se poveća funkcionalnost. Kao primer sam uzeo GridView koji
u osnovnoj postavi nema&amp;nbsp; multiselect ali uz malo dorade postaje vrlo sličan gridovima
koje srećemo u windows programiranju. Ideja je da možemo da izaberemo više redova
u GridView tako što ćemo prilikom izbora držati taster CTRL. 
&lt;/p&gt;
&lt;p&gt;
Realizacija je sledeća: kad god kliknemo na neki red u GridView kontroli izvrši se
registracija tog klika i nakon postback-a se čitaju indeksi kliknutih redova na osnovu
kojih vraćamo redove u kontroli koji su izabrani. 
&lt;/p&gt;
&lt;p&gt;
Prvi korak je da kreiramo novu klasu koja će predstavljati DataGrid sa multiselect
opcijom. Ona će biti izvedena iz&amp;nbsp; System.Web.UI.WebControls.GridView klase i
čime obezbeđujemo nasleđivanje svih osobina i metoda ove klase na koje smo navikli. 
&lt;/p&gt;
&lt;p&gt;
public class MultiSelectGridView : System.Web.UI.WebControls.GridView
&lt;/p&gt;
&lt;p&gt;
Zatim je potrebno da na svaki red koji generiše osnovna&amp;nbsp; GridView klasa “zalepimo”
onclick javascript događaj (event handler). To radimo tako što promenimo OnRowDataBound
metodu iz osnovne klase. 
&lt;/p&gt;
&lt;p&gt;
1: protected override void OnRowDataBound(GridViewRowEventArgs e)&lt;br&gt;
2:&amp;nbsp;&amp;nbsp;{&lt;br&gt;
3:&amp;nbsp;&amp;nbsp;&amp;nbsp;base.OnRowDataBound(e);&lt;br&gt;
4:&lt;br&gt;
5:&amp;nbsp;&amp;nbsp;&amp;nbsp;if (e.Row.DataItem != null)&lt;br&gt;
6:&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
7:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Row.Attributes.Add("OnClick", "msel(event)");&lt;br&gt;
8:&lt;br&gt;
9:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_id = this.PageIndex + "." + e.Row.RowIndex.ToString();&lt;br&gt;
10:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Row.Attributes.Add("index", _id);&lt;br&gt;
11:&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
12:&amp;nbsp;&amp;nbsp;}
&lt;/p&gt;
&lt;p&gt;
Glavna stvar se nalazi u liniji 7, gde na Row element dodajemo atribut OnClick koji
će izvršavati msel(event) javascript funkciju na svaki klik. Javascript funkcija msel
registruje gde se izvršio click događaj i upisuje indeks kliknutog elementa u skriveno
(hidden) polje čiju vrednost ćemo kasnije, u postback-u, da parsiramo. Ovu funkciju
ćemo da kreiramo i registrujemo kasnije.&lt;br&gt;
Sledeća stvar se nalazi na linijama 9 i 10. Naime, tu kreiramo indeks elementa koji
je kliknut i vezujemo ga za sam element. Njegova konstrukcija je vrlo jednostavna,
“_id = broj stranice + tačka + indeks trenutnog reda”. Dobijeni indeks se upisuje
kao dodatni atribut u element koji predstavlja red u GridView-u.&lt;br&gt;
Da bi na klijentskoj strani znali koji red je izabran kreiramo Javascript funkciju
“msel“ koju ćemo kasije da registrujemo na strani (podvučeni delovi code-a se automatski
generišu u runtime-u).
&lt;/p&gt;
&lt;p&gt;
Pre nego što prokomentarišem javascript code, da kažem par reči o html code-u koji
generiše standardni GridView. GridView je u stvari obična tabela tj &amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;...
konstrukcija. &amp;lt;tr&amp;gt; tag predstavlja red u našoj kontroli (Row) i na njega se
“lepi” OnClick event. Sam event se zapravo okida na &amp;lt;td&amp;gt; elementu ali se propagira
do prvog roditeljskog (parent) elementa koji ima handler tj definisan onclick a to
je &amp;lt;tr&amp;gt; element. I evo javascript-a koji se generiše.&lt;br&gt;
Da prokomentarišemo javascript.
&lt;/p&gt;
&lt;p&gt;
1:&amp;lt;script language="javascript"&amp;gt;&lt;br&gt;
2:&amp;nbsp;function msel(e, o)&lt;br&gt;
3:&amp;nbsp;{
&lt;/p&gt;
&lt;p&gt;
kreiramo referencu na skriveni (hidden) html element koji u sebi sadrži informacije
koji redovi su selektovani
&lt;/p&gt;
&lt;p&gt;
4:&amp;nbsp;&amp;nbsp;var selected = document.getElementById(o); 
&lt;/p&gt;
&lt;p&gt;
Zatim kreiramo referencu prema Event-u koji je inicirao izvršenje funkcije. Ova referenca
nam treba da bi saznali koji je objekat inicirao Event i da li je pri kliku bio pritisnut
taster CTRL. Linija 6 daje neposredni objekat koji je inicirao event, u ovom slučaju
&amp;lt;td&amp;gt; tj ćeliju koja se nalazi unutar &amp;lt;tr&amp;gt; elementa. Na liniji 7 hvatamo
sam &amp;lt;tr&amp;gt; element koji nosi informaciju o tome koji je indeks kliknutog elementa.
&lt;/p&gt;
&lt;p&gt;
5:&amp;nbsp;&amp;nbsp;e = e ? e : ((window.event) ? event : null);&lt;br&gt;
6:&amp;nbsp;&amp;nbsp;var obj = e.target ? e.target : ((e.srcElement) ? e.srcElement : null);&lt;br&gt;
7:&amp;nbsp;&amp;nbsp;obj = obj.parentElement ? obj.parentElement : obj.parentNode;&lt;br&gt;
8:&amp;nbsp;&amp;nbsp;var objParent = obj.parentElement ? obj.parentElement : obj.parentNode;
&lt;/p&gt;
&lt;p&gt;
Na linijama 9 i 10&amp;nbsp; kreiramo objekte String tipa koji redom nose podatke o izabranim
redovima i o trenutno kliknutom objektu tj njegovom indeksu. 
&lt;/p&gt;
&lt;p&gt;
9:&amp;nbsp;&amp;nbsp;var sel = new String(selected.value);&lt;br&gt;
10:&amp;nbsp;&amp;nbsp;var id = new String(obj.getAttribute("index"));&lt;br&gt;
11:&amp;nbsp;&amp;nbsp;var cssclass;&lt;br&gt;
12:&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Linija 13 ispituje da li je prilikom klika bio pritisnut i taster CTRL. Ukoliko jeste
na liniji 14 proveravamo da li je red već izabran. Ukoliko jeste, ukloni ga iz liste
izabranih i promeni css klasu za tekuću liniju. U suprotnom ubaci ga na listu izabranih
i promeni css klasu.
&lt;/p&gt;
&lt;p&gt;
13:&amp;nbsp;&amp;nbsp;if (e.ctrlKey) {&lt;br&gt;
14:&amp;nbsp;&amp;nbsp;&amp;nbsp;if (sel.indexOf("-" + id + "-") &amp;gt; -1) {&lt;br&gt;
15:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;selected.value = sel.replace("-" + id + "-", "");&lt;br&gt;
16:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj.className = "CssClassRow";&lt;br&gt;
17:&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
18:&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br&gt;
19:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;selected.value = sel + "-" + id + "-"; 
&lt;br&gt;
20:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;obj.className = "CssClassRowSelected";&lt;br&gt;
21:&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&lt;br&gt;
22:&amp;nbsp;&amp;nbsp;} 
&lt;/p&gt;
&lt;p&gt;
Ukoliko CTRL nije pritisnut (linija 23) lista izabranih indeksa svodi se na trenutno
izabran a css klase se menjaju tako da su svi objekti neselektovani.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
23:&amp;nbsp;&amp;nbsp;else { 
&lt;br&gt;
24:&amp;nbsp;&amp;nbsp;&amp;nbsp;if (sel.indexOf("-" + id + "-") &amp;gt; -1) { 
&lt;br&gt;
25:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cssclass = "CssClassRow"; selected.value = ""; 
&lt;br&gt;
26:&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&lt;br&gt;
27:&amp;nbsp;&amp;nbsp;&amp;nbsp;else { 
&lt;br&gt;
28v&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cssclass = "CssClassRowSelected"; 
&lt;br&gt;
29:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;selected.value = "-" + id + "-"; 
&lt;br&gt;
30:&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&lt;br&gt;
31:&amp;nbsp;&amp;nbsp;&amp;nbsp;var trs = objParent.getElementsByTagName("tr");&lt;br&gt;
32:&amp;nbsp;&amp;nbsp;&amp;nbsp;for(i = 0; i &amp;lt; trs.length; i++) 
&lt;br&gt;
33:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (trs[i].getAttribute("index"))&lt;br&gt;
34:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trs[i].className = "CssClassRow";obj.className =
cssclass;&lt;br&gt;
35:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&lt;br&gt;
36:&amp;nbsp;&amp;nbsp;} 
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;Napomena: podvučeni delovi se generišu
&lt;/p&gt;
&lt;p&gt;
Funkcija&amp;nbsp; disableSelection samo ne dozvoljava da se na kliknutim redovima izvrši
selekcija teksta. Za detalje pogledajte &lt;a href="http://www.dynamicdrive.com/dynamicindex9/noselect.htm"&gt;http://www.dynamicdrive.com/dynamicindex9/noselect.htm&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
37:&amp;nbsp;function disableSelection(target) { &amp;nbsp;&lt;br&gt;
38:&amp;nbsp;&amp;nbsp;if (typeof target.onselectstart!="undefined") &amp;nbsp;&amp;nbsp;&lt;br&gt;
39:&amp;nbsp;&amp;nbsp;&amp;nbsp;target.onselectstart=function(){return false;}; &amp;nbsp;&lt;br&gt;
40:&amp;nbsp;&amp;nbsp;else if (typeof target.style.MozUserSelect!="undefined")&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;br&gt;
41:&amp;nbsp;&amp;nbsp;&amp;nbsp;target.style.MozUserSelect="none";&amp;nbsp; &amp;nbsp;&lt;br&gt;
42:&amp;nbsp;&amp;nbsp;else &amp;nbsp;&amp;nbsp;&lt;br&gt;
43:&amp;nbsp;&amp;nbsp;&amp;nbsp;target.onmousedown=function(){return false;}; &amp;nbsp;&lt;br&gt;
44:&amp;nbsp;&amp;nbsp;target.style.cursor = "default"; 
&lt;br&gt;
45:&amp;nbsp;} 
&lt;br&gt;
46:&amp;lt;/script&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Ok, sledeća metoda koju menjamo u odnosu na originalnu GridView klasu je OnRowCreated. 
&lt;/p&gt;
&lt;p&gt;
1:protected override void OnRowCreated(GridViewRowEventArgs e)&lt;br&gt;
2:{&lt;br&gt;
3:&amp;nbsp;base.OnRowCreated(e);&lt;br&gt;
4:&lt;br&gt;
5:&amp;nbsp;_id = this.PageIndex + "." + e.Row.RowIndex.ToString();&lt;br&gt;
6:&lt;br&gt;
7:&amp;nbsp;if (selected != null &amp;amp;&amp;amp; selected.IndexOf("-" + _id + "-") &amp;gt; -1)&lt;br&gt;
8:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Row.CssClass = CssClassRowSelected;&lt;br&gt;
9:&amp;nbsp;else&lt;br&gt;
10:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Row.CssClass = CssClassRow;&lt;br&gt;
11:}
&lt;/p&gt;
&lt;p&gt;
Opet kreiramo indeks, linija 5, i ako je trenutni red u listi selektovanih onda mu
menjamo css klasu. 
&lt;/p&gt;
&lt;p&gt;
I na kraju menjamo CreateChildcontrols metodu. Zapravo samo je proširujemo. Cilj je
da između svakog postback-a očuvamo stanje selektovanih redova. 
&lt;/p&gt;
&lt;p&gt;
1:protected override void CreateChildControls()&lt;br&gt;
2:{
&lt;/p&gt;
&lt;p&gt;
Naravno pustimo da se kreiraju sve potrebne kontrole koje se kreiraju za GridView
(Linija 3)
&lt;/p&gt;
&lt;p&gt;
3:&amp;nbsp;base.CreateChildControls();&lt;br&gt;
4:&lt;br&gt;
5:&amp;nbsp;string[] selectedArray;&lt;br&gt;
6:&lt;br&gt;
7:&amp;nbsp;if (!string.IsNullOrEmpty(selected))&lt;br&gt;
8:&amp;nbsp;{
&lt;/p&gt;
&lt;p&gt;
Izdvojimo indekse redova selektovanih na client strani (linija 9.) .
&lt;/p&gt;
&lt;p&gt;
9:&amp;nbsp;&amp;nbsp;selectedArray = selected.Split('-');&lt;br&gt;
10:
&lt;/p&gt;
&lt;p&gt;
Kreiramo listu int vrednosti koja će sadržati indekse izabranih redova.
&lt;/p&gt;
&lt;p&gt;
11:&amp;nbsp;&amp;nbsp;SelectedIndexs = new List&amp;lt;int&amp;gt;();
&lt;/p&gt;
&lt;p&gt;
Kreiramo string niz koji će u sebi sadržati tekuću stranu i tekući index na strani.
&lt;/p&gt;
&lt;p&gt;
12:&amp;nbsp;&amp;nbsp;string[] pageAndIndex;
&lt;/p&gt;
&lt;p&gt;
Za svaki element u selectedArray a na osnovu stranice i indeksa preračunamo pravi
indeks i ubacimo u&amp;nbsp; SelectedIndexs.
&lt;/p&gt;
&lt;p&gt;
13:&amp;nbsp;&amp;nbsp;foreach (string s in selectedArray)&lt;br&gt;
14:&amp;nbsp;&amp;nbsp;{&lt;br&gt;
15:&amp;nbsp;&amp;nbsp;&amp;nbsp;if (s.Length &amp;gt; 0)&lt;br&gt;
16:&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
17:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pageAndIndex = s.Split('.');&lt;br&gt;
18:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SelectedIndexs.Add(int.Parse(pageAndIndex[0]) * this.PageSize
+ int.Parse(pageAndIndex[1]));&lt;br&gt;
19:&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
20:&amp;nbsp;&amp;nbsp;}&lt;br&gt;
21:&amp;nbsp;}&lt;br&gt;
22:
&lt;/p&gt;
&lt;p&gt;
Registrujemo skriveno html polje u koje upisujemo koji su izabrani redovi.
&lt;/p&gt;
&lt;p&gt;
23:&amp;nbsp;this.Page.ClientScript.RegisterHiddenField(selectedKey, selected);
&lt;/p&gt;
&lt;p&gt;
Registrujemo blok sa javascript funkcijama opisanim gore.
&lt;/p&gt;
&lt;p&gt;
24:&amp;nbsp;this.Page.ClientScript.RegisterClientScriptBlock( ( (System.Web.UI.WebControls.GridView)this).GetType(),
"MultiselectGridView_js", js);&lt;br&gt;
25:
&lt;/p&gt;
&lt;p&gt;
I na kraju na GridView kontrolu dodamo još jednu literal kontrolu koja u sebi sadrži
poziv funkcije&amp;nbsp; disableSelection koja ne dozvoljava da se selektuje tekst na
upravo kreiranoj kontroli.
&lt;/p&gt;
&lt;p&gt;
26:&amp;nbsp;Literal l = new Literal();&lt;br&gt;
27:&amp;nbsp;l.Text = "&amp;lt;script language=\"javacript\" type=\"text/javascript\"&amp;gt;disableSelection(document.getElementById(\""
+ this.ClientID + "\"));&amp;lt;/script&amp;gt;";&lt;br&gt;
28:&amp;nbsp;this.Controls.Add(l);&lt;br&gt;
29:}
&lt;/p&gt;
&lt;p&gt;
I to je to, kompletan code možete da skinete &lt;a href="http://www.vlatkovic.net/download/GridView_na_kvadrat.zip"&gt;ovde&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.vlatkovic.net/aggbug.ashx?id=28414adb-3fad-487c-a3b0-c32c1566b796" /&gt;</description>
      <comments>http://www.vlatkovic.net/CommentView,guid,28414adb-3fad-487c-a3b0-c32c1566b796.aspx</comments>
      <category>Programiranje;Programiranje/asp.net;Programiranje/c#</category>
    </item>
  </channel>
</rss>