27 Aralık 2008 Cumartesi

Visual Studio 2005 ve Visual Web Developer Platformlarında Öntanımlı Tarayıcıyı Değiştirmek

Merhabalar,

Bir web yazılım geliştiricisi/tasarımcısı olarak Visual Studio 2005 ya da Visual Web Developer platformlarında Ctrl+F5 ile projenizi açtığınızıda sayfanız öntanımlı (default) olarak Internet Explorer tarayıcısı ile açılır.

Ancak şu da bir gerçek ki Internet Explorer (son sürümünde bile) web standartları konusunda oldukça cahil. Dolayısyla geliştirmelerinizi sadece IE üzerinden yaparsanız ortaya web standartlarının çoğundan yoksun ve diğer tarayıcılarda (Firefox, Opera, Crome, Safari) düzgün görünmeyen bir web projesi/sitesi çıkacaktır. Oysa ki internetteki hedef kitlenize erişilebilir ve tüm tarayıcılarla uyumlu bir içerik/tasarım sunmak için geliştirmelerinizi tüm tarayıcı çeşitleri ile uyumlu yapmak durmundasınız. Aksi halde farklı tarayıcılarla projenize erişen ziyaretçileriniz sizi tekrar ziryaret etmek konusunda isteksiz olacaklardır.

Konuyu uzatmadan asıl paylaşmak istediğime geleyim: .Net ortamında projenizi Ctrl+F5 ile IE'den farklı bir tarayıcıda nasıl başlatabiliriz?

(Bu konuda türkçe içeriğe rastlamadığım için paylaşıyorum.)

Adım 1

Solution Explorer da .aspx uzantılı dosyanıza sağ tıklayarak "Browse With..." tıklayın.
Adım 1

Adım 2
Açılan popup pencerede "Add" tıklayıp tarayıcınızı seçin ve her defasında bu tarayıcı ile açılmasını istiyorsanız "Set as Default" butonunu tıklayın.
Adım 2

Adım 3
Tarayıcı pencerenizin boyutunu da aşağıdaki resimdeki gibi seçebiliyorsunuz.
Adım 3
Yardımcı olması dileğiyle...

Başka bir konuda tekrar görüşmek üzere,

Sevgiler, Saygılar...

9 Temmuz 2008 Çarşamba

VS.NET 2003 - The project you are trying to open is a Web project. You need to open it by specifying its URL path.

Merhabalar

Visual Studio.NET 2003 platformunda karşılaştığım bir hatayı ve çözümünü paylaşıyorum sizlerle.

Problem: Visual Studio.NET 2003 platformunda var olan bir web projesini ( Ms Visual SourceSafe ya da başka bir yolla) lokal inize aldığınızda; The project you are trying to open is a Web project. You need to open it by specifying its URL path. hatası ile karşılaşabilirsiniz.

Çözüm: Projenizin ismi SampleProject olsun. c:\Inetpub\wwwroot\SampleProject\SampleProject.csproj isminde proje dosyanız vardır. Hatanın nedeni .csproj uzantılı proje dosyanız ile aynı dizinde olması gereken .csproj.webinfo uzantılı proje dosyanızın olmamasıdır. Hatayı çözmek için aşağıdaki içerikte bir SampleProject.csproj.webinfo dosyası oluşturup proje klasörünüze eklemek yeterli olacaktır.

<VisualStudioUNCWeb>

<Web URLPath = "http://localhost/SampleProject/SampleProject.csproj" />

</VisualStudioUNCWeb>



Aşağıdaki linklerde de hata ile ilgili (ingilizce) çözüm önerileri bulabilirsiniz.

http://support.microsoft.com/kb/830611
http://datacogs.com/datablogs/archive/2005/01/28/209.aspx

Başka bir konuda tekrar görüşmek üzere,

Sevgiler, Saygılar...

5 Temmuz 2008 Cumartesi

Projede Toplam Çalışma Saati

Merhabalar ,
Bir rapor hazırlamak için, mesai saatleri içinde çalışılan zamanı bulan bir fonksiyona ihtiyaç duydum. İlgili fonksiyon hafta sonlarını , öğlen aralarını ve tüm resmi tatilleri çıkarıp toplam kaç dakika çalışılmış ise onu getirecek bir özellik barındırmalı idi. Internet te aradığım kadarı ile isteklerime bu şekilde çok fazla cevap veren bir fonksiyon bulamadım.Bu nedenle kendim yazdım ve bunu sizlerle paylaşmak istedim.

Öncelikle ilgili veritabanında Holidays Tablosu oluşturdum ve alanları da
HolidayID int , (primary key)
OfficialHolidayDate datetime , -- hangi gün resmi tatil ise
IsAllDayHoliday bit , -- Tüm gün mü tatil yoksa yarım gün mü
FinishTime char (5) -- eğer yarım gün ise mesai kaçta bitiyor

Bu tabloya ilgili resmi tatilleri eklemeniz gerekmektedir.

Declare
@WorkBeginDate Datetime, -- ilgili projenin başlama zamanı
@WorkEndDate DateTime, -- ilgili projenin bitiş zamanı
@BeginDayMorning char(5), -- mesainin sabah başlama saati
@EndDayMorning Char(5), -- mesainin öğlen bitiş zamanı
@BeginDayAfternoon char(5), -- mesainin öğleden sonra başlama zamanı
@EndDayAfternoon Char(5), -- mesainin öğleden sonra bitiş zamanı
@ExcludeWeekend Bit -- hafta sonları çıkarılacak mı ?

-- ilk değerler veriliyor. Fonksiyona parametre olarak ta geçebilirsiniz. Burada örnek olması için default değerler verilmiştir.
SET @WorkBeginDate = '20080104 08:00'
SET @WorkEndDate = '20080105 14:30'

SET @BeginDayMorning = '08:00'
SET @EndDayMorning = '12:00'
SET @BeginDayAfternoon = '13:00'
SET @EndDayAfternoon = '17:30'
SET @ExcludeWeekend = 1

DECLARE
@BeginDateBeginDay Datetime, -- projenin başlama zamanında mesainin başlangıcı
@BeginDateEndDay Datetime, -- projenin başlama zamanında mesainin bitisi
@EndDateBeginDay Datetime, -- projenin bitiş gününde mesainin bitisi
@WorkDayLength INT, -- bir günde çalışılan toplam dakika
@Minutes INT -- toplamda bulacak olduğumuz süre

--- Günlük Toplam Çalışma Saati Dakika olarak öğlen arası dahil

SET @WorkDayLength = DATEDIFF(mi,'20080101 ' + @BeginDayMorning,'20080101 ' + @EndDayAfternoon) - 60
SET @BeginDateBeginDay = CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @BeginDayMorning -- normal mesai başlama o gün için
SET @BeginDateEndDay = CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayAfternoon -- normal mesai bitiş o gün için
SET @EndDateBeginDay = CONVERT(VARCHAR,@WorkEndDate,101)+ ' ' + @BeginDayMorning -- bu da işin bittiği son gün mesai başlangıcı

IF ( SELECT COUNT(*) FROM Holidays
WHERE ( CONVERT(Varchar,@BeginDateEndDay,101) = OfficialHolidayDate
and IsAllDayHoliday = 1 ) ) > 0
SELECT @Minutes = 0

-- EĞER normal mesai bitiş o gün için büyükse işin bitme zamanından bu durumda
-- @BeginDateEndDay enddate ' e eşit olmalı
ELSE IF @BeginDateEndDay > @WorkEndDate
Begin
-- eğer iş öğlen arası açılıp öğlen arası bitti ise
IF @WorkBeginDate between CONVERT(Varchar,@WorkBeginDate,101) + ' ' +
@EndDayMorning and CONVERT(Varchar,@WorkBeginDate,101) + ' ' +
@BeginDayAfternoon and @WorkEndDate between
CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayMorning and
CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @BeginDayAfternoon
SELECT @Minutes = 0
-- iş o gün sabah çalışma saatleri arasında bitmiş mi
else if @WorkBeginDate between CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @BeginDayMorning and CONVERT(Varchar,@WorkBeginDate,101) + ' ' +
@EndDayMorning and @WorkEndDate between
CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @BeginDayMorning and
CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayMorning
SELECT @Minutes = DATEDIFF(mi,@WorkBeginDate , CONVERT(Varchar,@WorkEndDate,101) + ' ' + @EndDayMorning )

-- öğleden sonra bitmiş ise
else if @WorkBeginDate between CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayMorning and
CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayAfternoon
SELECT @Minutes = DATEDIFF(mi,CONVERT(Varchar,@WorkBeginDate,101) + ' ' + @EndDayMorning ,@WorkEndDate) - 60
else
SELECT @Minutes =
DATEDIFF(mi,@WorkBeginDate,@WorkEndDate) - 60

SET @BeginDateEndDay = @WorkEndDate
end
else
begin
SELECT @Minutes =
DATEDIFF(mi,@WorkBeginDate,@BeginDateEndDay) – 60
-- öğlen arası da var
end

IF @BeginDateEndDay < @WorkEndDate
BEGIN
DECLARE @Counter INT
SET @Counter = 1
IF @ExcludeWeekend = 1
BEGIN
WHILE DateAdd(dd,@Counter,@BeginDateBeginDay)
< @EndDateBeginDay
BEGIN
--- yarım gün tatil mi
IF ( SELECT COUNT(*)
FROM Holidays
WHERE
(
DateAdd(dd,@Counter,
CONVERT(Varchar,@WorkBeginDate,101) ) =
OfficialHolidayDate
and IsAllDayHoliday = 0 )
) > 0
BEGIN
SELECT @Minutes =
@Minutes +
case
when CONVERT(char(5),FinishTime)
>= @EndDayMorning
-- öğleden sonranın bitiş saatinde ise
then
(
DATEDIFF(mi,
CONVERT(Varchar,OfficialHolidayDate ,101) + ' '
+ @BeginDayMorning ,CONVERT(Varchar,OfficialHolidayDate ,101) + ' ' + FinishTime)
) - 60
ELSE
(
DATEDIFF(mi,
CONVERT(Varchar,OfficialHolidayDate ,101) + ' '
+ @BeginDayMorning ,CONVERT(Varchar,OfficialHolidayDate ,101) + ' ' + FinishTime)
)
END
FROM Holidays
WHERE DateAdd(dd,@Counter,CONVERT(Varchar,@WorkBeginDate,101) ) = OfficialHolidayDate and IsAllDayHoliday = 0
End
else
if ( SELECT COUNT(*)
FROM Holidays
WHERE ( DateAdd(dd,@Counter,CONVERT(Varchar,@WorkBeginDate,101) ) = OfficialHolidayDate
and IsAllDayHoliday = 1 ) ) = 0 and (DATEPART(dw,DateAdd(dd,@Counter,@WorkBeginDate)) IN (2,3,4,5,6))
begin
SELECT @Minutes = @Minutes + (1 * @WorkDayLength)
end
set @Counter = @Counter + 1
end
END
ELSE
BEGIN
SELECT @Minutes = @Minutes + (( DATEDIFF(dd,@BeginDateBeginDay,@EndDateBeginDay) ) * @WorkDayLength) -- öğlen arası çıkmış şekilde
--SELECT @Minutes = @Minutes + (( DATEDIFF(dd,@BeginDateBeginDay,@EndDateBeginDay) - 1 ) * @WorkDayLength)
END

-- Yapılan işin son günü
if ( SELECT COUNT(*) FROM Holidays
WHERE ( CONVERT(Varchar,@WorkEndDate,101) = OfficialHolidayDate
and IsAllDayHoliday = 1 ) ) > 0
SELECT @Minutes = @Minutes + 0
else if CONVERT(Varchar,@WorkEndDate,101) + ' ' + @BeginDayAfternoon <= @WorkEndDate
and (DATEPART(dw, @WorkEndDate ) IN (2,3,4,5,6))
SELECT @Minutes = @Minutes + DATEDIFF(mi,@EndDateBeginDay,@WorkEndDate) - 60 -- öğle arası çıkarılıyor
-- eğer öğleden sonra bitmiş ise
else if (DATEPART(dw, @WorkEndDate ) IN (2,3,4,5,6))
SELECT @Minutes = @Minutes + DATEDIFF(mi,@EndDateBeginDay,CONVERT(Varchar,@WorkEndDate,101) + ' ' + @EndDayMorning )
end

SELECT @Minutes/60/24, 'Gün' , 'Saat', @Minutes/60, 'Dakika ' ,@Minutes

ilgili dosyayı buradan indirebilirsiniz.

9 Haziran 2008 Pazartesi

Ajax Modal Popup - Görünüp Kaybolma Problemi

Merhabalar,

Asp.Net projelerinizde AjaxControlToolkit ile Modal Popup kullandı iseniz sayfanızın ilk yüklenmesiyle Modal Popup ınızın kısa bir süreliğine görünüp kaybolması problemi ile karşılaşmışsınızdır.

İşte çözüm; ModalPopupExtender ınızın PopupControlID si ile hükmettiği Panelinizde style="display:none;" özelliğini atayarak Modal Popup ınızın ilk sayfa yüklenmesinde görünüp kaybolmasını engelleyebilirsiniz.

Başka bir konuda tekrar görüşmek üzere,

Sevgiler, Saygılar...

12 Mart 2008 Çarşamba

Extension Methods nedir ?

c# 3.0 ile gelen yeni bir özelliktir. Bu metod yazılımcıya var olan bir tipe herhangi bir yeniden bir tip yaratma

olmadan yeni methodlar eklemeye olanak tanır.
Uzun zamandır beklediğim bir özellik idi çünkü bazı kontroller için uzun uzadıya ilgili sınıfı çağırmak zor geliyodu bana .
Mesala bir string değer in email olup olmadığını kontrol etmek için bir utility classı yazıp ilgili
class ta da IsValidEmail(string str) gibi bir fonksiyon bulunmakta ve değerin kontol etmek istediğimde de IsValidEmail(strEmail) yazmakta idim.Aslında bunda yanlış bir şey yok ama okunurluk bazında zor oluyordu.
Şu şekilde olması sizce de iyi olmaz mı? strEmail.IsValidEmail() bu kod daha okunaklı değil mi? bu yapacaklarımızdan sadece bir tanesi .
peki aynı şekilde diğer sık kulladığımız sınıflara da eklemek istemez miyiz ?
Niye her zaman bir string değeri
sayıya dönüştürken Convert.ToInt32(değişken) şeklinde yazıyoruz da neden degisken.ToInt32() yazamıyorum.İşte burada c# 3.0 ile gelen bu özellik sayesinde ilgili isteklerimiz yapabiliyoruz.

İlgili Class Yapısını string değer için şu şekilde yazabiliriz.

using System;
namespace ExtensionMethods
{
public static class ExtensionMethods
{

private static readonly string CharactersLowerCase = "abcdefghijklmnopqrstuvwxyz";
public static readonly string ValidEMailCharacters = "0123456789abcdefghijklmnopqrstuvwxyz_";

#region Method - ToInt32

public static int ToInt32(this string str)
{
return Int32.Parse(str);
}

#endregion

#region Method - IsMoney

public static bool IsMoney(this string value)
{
if (value == null)
return false;
string tmp = value.Trim();
if (tmp.Length == 0)
return false;
for (int i = 0; i < tmp.Length; i++)
if (!char.IsDigit(tmp, i) && tmp.ToCharArray()[i] != ',')
return false;
return true;
}

#endregion

#region Method - EMail

public static bool CheckEMail(this string eMail)
{
if (eMail == null)
return false;
string email = eMail.Trim();
string[] strEmail = email.Split(new char[] { '@' });
if (strEmail.Length != 2 || strEmail[0].Length < 2 || strEmail[1].Length < 5)
return false;

string[] left = strEmail[0].Split(new char[] { '.', '-' });
for (int i = 0; i < left.Length; i++)
if (left[i].Length < 1 || !CheckEMailPart(left[i]))
return false;
string[] right = strEmail[1].Split(new char[] { '.' });
if (right.Length < 2 || right[right.Length - 1].Length < 2)
return false;
for (int i = 0; i < right.Length - 1; i++)
{
if (right[i].Length < 2)
return false;
string[] tmp = right[i].Split(new char[] { '-' });
for (int j = 0; j < tmp.Length; j++)
if (tmp[j].Length < 1 || !CheckEMailPart(tmp[j]))
return false;
}
return CheckOnlyLowerCaseCharacters(right[right.Length - 1]);
}

private static bool CheckEMailPart(string str)
{
if (str == null || str == "")
return false;
for (int i = 0; i < str.Length; i++)
if (ValidEMailCharacters.IndexOf(str[i]) < 0)
return false;
return true;
}
private static bool CheckOnlyLowerCaseCharacters(string str)
{
if (str == null || str == "")
return false;
for (int i = 0; i < str.Length; i++)
if (CharactersLowerCase.IndexOf(str[i]) < 0)
return false;
return true;
}

#endregion



}
}


bu kısım ilgili class yapısı . Peki bu class ı nasıl kullacağız.
öncelikle
using ExtensionMethods;
eklememiz gerekmektedir.

string str = "aaq@aa.com";

if (str.CheckEMail())
{
//Doğru ise bunu yap
}
else
{
//yanllış ise bunu yap
}

şeklinde kullanabiliriz.

Bir sonraki yazımda görüşmek üzere ....
Sevgiyle Kalın

Oğuzhan KIVRAK