Glöm inte att sätta oanvända klasser till Obsolete

Något som jag måste bli bättre på är att markera oanvända kodstycken som Obsolete. Det innebär alltså att klassen helst inte ska användas längre och har tagit ett steg vidare mot avveckling. Man kan skriva ett meddelande också som kommer upp i kompilern som påminnelse för att man ska ta bort dem.

Exempel från MSDN.

 

[Obsolete("This class is obsolete; use class B instead")]
class A{
public void F() {}
}
By Jesper Lind

Resharper - lika kul som Tetris

http://www.codeodyssey.se/upload/resource/blog/resharper-tetris.gif

Måste bara rekommendera Visual Studio-tillägget Resharper, ifall det är någon VS-kodare där ute som inte provat det ännu. Utan att gå in för djupare på vad det gör så kan man säga att det är som en slags automagiskt refaktionerings-verktyg.

Med detta kan till och med städa gammal kod vara roligt. Här äver ser ni en bild på de olika färgkoderna. De röda raderna betyder att referens saknas, och man hoppar till rätt ställe i koden genom att klicka på dem.

Finner det nästan lika kul som Tetris så det har definitivt gjort mig till en gladare kodare.

Men tänkt på att du behöver en relativt kraftfull dator med snabb processor, mycket ram och en snabb hårddisk, för att använda det, då det är väldigt resurskrävande.

By Jesper Lind

Klipp av för långa texter på smart sätt

Hittade en smidig funktion hos Ted Nyberg som klipper av texter på ett bra sätt. Hacket kommer aldrig i mitten av ett ord och ifall det är mitt i en mening läggs tre punkter till.

Hoppas att det är lugnt att jag återpublicerar koden här också.

public static string TruncateText(string OriginalText, 
    int MaxCharacters)
{
   string stopChars = " .!?";

   if (OriginalText.Length > MaxCharacters)
   { 
      string stringToReturn = OriginalText.Substring(0, MaxCharacters); 

      while (!stopChars.Contains(stringToReturn.Substring
         (stringToReturn.Length-1)) && stringToReturn.Length>0)
      { 
         stringToReturn = stringToReturn.Substring(0, 
            stringToReturn.Length - 1);
      } 

      if (stringToReturn.Length == 0)
         stringToReturn = OriginalText.Substring(MaxCharacters);

      stringToReturn = stringToReturn.Trim(); 
     
      if(!stopChars.Contains(stringToReturn.Substring
         (stringToReturn.Length-1))) 
      { 
         stringToReturn += "..."; 
      } 

      return stringToReturn; 
   } 
   else 
   { 
      return OriginalText; 
   }
}

By Jesper Lind

Förhindra PostBack på ImageButton och kör JavaScript istället

Hade lite problem med att en ImageButton gjorde postback hela tiden, fast jag ville köra ett eget JavaScript. Trixet är att se till att return false; är med i slutet av JavaScript-anropet som jag läste om här.

<asp:TextBox ID="tbSearch" runat="server" />
<asp:ImageButton id="ibSearch"
OnClientClick="do_search();return false;"
ImageUrl="search-button.gif" runat="server" />
<script type="text/JavaScript">
function do_search()
{
window.location.href="search-results.aspx?s=" + document.getElementById('<%=tbSearch.ClientID %>').value;
}</script>

By Jesper Lind

Snyggt sätt att använda sig av Sessions

De flesta har någon gång stött på problemet med att man vill spara information mellan olika sidor och/eller olika postbacks. Då blir sessions ofta en sista utväg om något annat alternativ inte går att använda. Här visar vi ett enkelt och snyggt sätt att använda Sessionobjectet som vilken variabel som helst. Vi visar hur man enkelt kan spara en arraylist i en session.

public ArrayList NewProducts
{
get
{
if (Session["newProducts"] == null)
{
return new ArrayList();
}
else
{
return Session["newProducts"] as ArrayList;
}
}
set
{
Session["newProducts"] = value;
}
}

Det är en property som håller en session internt. Bara att tilldela och ta ut som en vanlig variabel. Behöver aldrig kontrollera och skapa session vid första användandet. Ofta resulterar det i att det står if(Session["newProducts"]!= null) överallt i koden, men det slipper man nu.

By Glenn Lundberg

Undvik konverteringsfel med nullvärden från databasen

IBland får jag felet "Input string was not in a correct format." vid funktioner enligt nedan och det finns null-värde i databasen.

<%# GetUser(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "UserId"))) %>

Då kan man göra så här för att parera nullvärdena och istället skicka in en nolla.

<%# GetUser(Eval("UserId") == DBNull.Value ? 0 : Convert.ToInt32(Eval("UserId"))) %>

Eller i Code Behind:

int userId = objDataReader["UserId"] == DBNull.Value ? 0 : Convert.ToInt32(objDataReader["UserId"]);

By Jesper Lind

Kopiera rader mellan GridViews - En enkel operation?

Man kan tro att det är världens enklaste sak att kopiera en rad från en GridView till en annan. Men den metoden många försöker med först resulterar ofta i "This row already belongs to another table". Här visar vi en enkel metod för att lösa problemet.

DataTable newtable = new DataTable();
DataTable temptable = new DataTable();
CheckBox cb;
BLL bll = new BLL();//Our Business Layer
foreach(GridViewRow row in GridView2.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
cb = row.FindControl("CheckBox1") as CheckBox;
if (cb.Checked == true)
{
temptable.Clear();
temptable = bll.GetItem(Convert.ToInt32(row.Cells[0].Text));
newtable.ImportRow(temptable[0]);
}
}
}
GridView3.DataSource = newtable;
GridView3.DataBind();

Trixet är alltså att skapa en tabell med den raden man vill kopiera och sedan importera den till en ny tabell. Det gå inte att bara flytta över DataRowObjektet utan att få ett fel.

Denna koden kopierar alla rader som är "checked" från gridview2 till gridview3

cell[0] innehåller Id i gridview 2. (row.datakey skulle säkert funka lika bra)

By Glenn Lundberg

Inkludera CSS-filer med Code Behind

Att inkludera CSS-filer dynamiskt är något jag märker att vi gör allt oftare i projekten. Så dags att spara på bloggen hur man gör så vi slipper hitta exempel varje gång.

HtmlGenericControl includeCss = new HtmlGenericControl("link");
includeCss.Attributes.Add("type", "text/css");
includeCss.Attributes.Add("rel", "stylesheet");

includeCss.Attributes.Add("href", css.ToString());
this.Page.Header.Controls.Add(includeCss);

Se även hur man gör för att inkludera Javascript-filer och kodblock från .NET-kod.

By Jesper Lind

Validera CheckBox med CustomValidator

Försökte att lägga till en RequiredFieldValidator för att kontrollera att en CheckBox var ikryssad vid postning, men det gick inte så bra. Felet blev:

Control 'CheckBox1' referenced by the ControlToValidate property of
'RequiredFieldValidator1' cannot be validated.

Någonstans läste jag att man inte lagt till denna möjlighet på CheckBox för att "bägge värdena alltid är riktiga". Det kanske kan vara ett bra argument, men jag ville endå ha denna funktionelitet. I mitt fall gällde det en ruta som användaren måste kryssa i för att fortsätta.

Så jag gjorde det med en CustomValidator istället, så här ser uppmärkningen ut på sidan.

<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
<br />
<asp:CustomValidator ClientValidationFunction="ValidateChecked"
Runat="server" ID="termsReadUnchecked" ErrorMessage="You must tick this box to continue"/>

Och i koden bakom lägger jag till JavaScript-funktionen för valideringen.

HtmlGenericControl validateCheckedScript = new HtmlGenericControl("script");
validateCheckedScript.Attributes.Add("type", "text/javascript");
validateCheckedScript.InnerHtml = "function ValidateChecked(src, args){args.IsValid=document.getElementById(\"" + ChckBox1.ClientID + "\").checked;}";
this.Page.Header.Controls.Add(validateCheckedScript);

By Jesper Lind