Dot net In Blue

چهارشنبه، فروردین ۰۹، ۱۳۸۵

باز کردن پنجره جدید در asp.net


دوست عزیزی سوال جالبی کرد :"در جاوا اسكريپت دستوري به نام window.open براي ايجاد يك پنجره خالي داشتيم مي خواهم بدانم اين دستور در سي شارپ دات نت نيز وجود دارد يا خير" .

 باید همیشه یادمون باشه که #C و بقیه زبانهایی که با اونها دات مینویسم در حقیقت یک تکنولوژی سرور ساید رو توسعه میدن ، به همین جهت نباید از آونها توقع داشته باشیم که کارهای کلاینت ساید رو انجام بدن و در هر حال اگر هم با دات نت کار کلاینت سایدی میشه تنها جاوا اسکریپتیه که توسط خود برنامه تولید میشه ! (اگه دقت کنید همیشه یه فایل جاوا اسکریپت هم روی سرور شما موجوده که کلاسهای مورد نیاز دات نت رو در بر میگیره )
ولی برای اینکه بخوایم کاری کنیم که توسط برنامه نویسی دات نت یک پنجره باز بشه و اطلاعات فیلد های اون پنجرذه به پنجره مادر برگرده بدون اینکه یک خط جاوا اسکریپت توی وب فرم هامون بنوسیم باید جاوا اسکریپت رو به صفحه تزریق کنیم این کد به ما کمک میکنه تا این کار رو بکنیم :


این کد برای پنجره مادر است :


Code:
public class Default : Page
{
protected TextBox txtFirstName;
protected TextBox txtLastName;
protected Label Label1;
protected Label Label2;
protected HyperLink HyperLink1;
private void Page_Load(object sender, EventArgs e)
{
//create our update function
string scr = @"<script>
function update(elemValue)
{
document.getElementById('txtFirstName').innerText=elemValue[0];
document.getElementById('txtLastName').innerText=elemValue[1];
}
</script>";
// register the javascript into the Page
Page.RegisterClientScriptBlock("update", scr);
//add our popup onclick attribute to the desired element on the page (Here, Hyperlink1)
HyperLink1.Attributes.Add("onclick", "window.open('popup.aspx',null,'left=400, top=100, height=250, width= 250, status=n o, resizable= no, scrollbars= no, toolbar= no,location= no, menubar= no');");
}


و اما پنجره فرزند (پنجره ای که باز شده ) :


Code:
public class popup : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.Label Label2;
protected System.Web.UI.WebControls.TextBox txtLastName;
protected System.Web.UI.WebControls.TextBox txtFirstName;
protected System.Web.UI.WebControls.Label Label1;
private void Page_Load(object sender, System.EventArgs e)
{
string scr= @"<script>
function Done()
{
var fName=document.getElementById('txtFirstName').value;
var lName=document.getElementById('txtLastName').value;
var ret= new Array(fName,lName);
window.opener.update(ret);
window.close();
}
</script>;";
Page.RegisterClientScriptBlock("done", scr);
}
 

سه‌شنبه، فروردین ۰۸، ۱۳۸۵

در این مقاله بحث میکنیم که چطور در asp.net یک تصویر آفریده شده را بدون اینکه روی سرور save کنیم در صفحه وب خود به نمایش بگذاریم ،همینطور طریقه ذخیره سازی یک عکس آفریده شده در asp.net را بررسی خواهیم کرد ، دست آخر برنامه ای خواهیم نوشت که متنی را از QueryString بگیرید و با آن عکسی بسازد آن را نمایش دهد و ذخیره کند.

ابتدا بیایید کمی html به خاطر بیاوریم ، اگر هنوز هم یادمان باشد در گذشته میدانستم که با این کد میتوانیم یک عکس را در یک صفحه نمایش دهیم :

<img border="0" src="Images/pic.jpg" >

اینبار میخواهیم عکسی ر از یک فایل asp.net بخوانیم یعنی :

<img border="0" src=autoGen/pic.ASPX" >

خوب اولین سوالی که پیش می آید این است که حالا چه کاری است که ما لقمه رو دور سر خود بچرخوانیم مگر نمیتوانیم عکس را روی سرور آپلود کنیم ؟!؟

جواب این است : این روش فقط وقتی به کار میرود که ما بخواهیم عکسی را به صورت پویا تولید کنیم ، برای مثال شما تصور کنید که میخواهید نموداری از ارقام و اعداد بکشید و آن را ر صفحه وب نمایش دهید ، میخواهید به تناسب کاربر روی یک عکس چیزی بنویسید و به کاربر نمایش دهید ، میخواهید قسمتی از محتوای وب خود را به اتفاقا به صورت متنی هم ذخیره شده به دلایلی به عکس تبدیل کنید (مثلا فونت مخصوص ، عدم سرقت اطلاعات ، عدم به هم ریختگی هنگام پرینت ! ) و یا میخواهید عکس امنیتی تولید کنید که از فعالیت نام تعداد زیاد کاربر مجازی جلوگیری کنید.

در مثال های فوق میبینید که بسیار کار سختی است که عکس های لازم را تک تک به صورت آماده روی سرور نگهداری کنیم و در هنگام نیاز استفاده کنیم ، تولید پویای این تصاویر بسیار به صرفه تر است . در این مقاله قصد ندارم طریقه تولید یک عکس پویا را آموزش بدهم ، مقالات خوبی به فارسی درسایت iranasp.net و جود دارد که اتفاقا یکی از آنها را با نام "دستکاری تصاویر در دات نت" خود من نوشته ام . همینطور مقاله گرافيک در ASP.NET نیز میتواند دروازه ای برای ورود شما به دنیای گرافیک دات نتی باشد.

کد زیر در دات نت یک تصویر تولید میکند :

Bitmap mybmp =new System.Drawing.Bitmap(100,30);
 Graphics g = System.Drawing.Graphics.FromImage(mybmp);
 g.Clear(Color.Blue);
 Font myfont = new Font("Tahoma", 8, FontStyle.Bold);
 g.DrawString("I Love ASP.net ",myfont,Brushes.Yellow,9,8);
 Response.ContentType = "image/jpeg";
 mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

این کد را در قسمت Page_Load قرار دهید

private void Page_Load(object sender, System.EventArgs e)
 {
 //کد را اینجا بگذارید
}

فضای نام مورد نیاز به تور پیش فرض در ویژآل ایستدیو دات نت آورده شده است شما مطمئن شوید که فضا ی نام System.Drawing فراخوانی شده است.

حالا اگر این صفحه را اجرا کنید خواهید دید که با صفحه حاوی کد ها مانند عکس برخورد میشود ! یک عکس با پسوند ASPX !

در حقیقت این خط وظیفه این کار را به عهده میگیرد :

mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);

اگر خواستید این عکس را روی سرور هم ذخیره کنید میتوانید خط بالا را به صورت زیر تغییر دهید :

mybmp.Save(Server.MapPath("result.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);

کد بالا میتواند عکس را با نام result.jpg روی سرور ذخیره کند .

و آما انچه نباید فراموش شود

mybmp.Dispose();
 g.Dispose();

که به آخر کد های بالا اضافه میشود .

و در اینجا بد نیست یک ایده به شما بدهم ، فرض کنید شما میخواهید چارت تاریخی خاص از فعالیتی خاص را از با استفاده از اطلاعات دیتابیس بکشید ، در این صورت شما میتوانید از کوری استرینگ برای انتقال این داده ها به برنامه تولید کننده عکس کمک بگیرید ، برنامه کامل زیر نوشته کوری استرینگ را منتقل میکند آن را هم نمایش میدهد و و هم ذخیره میکند !(فراموش نکنیم که این برنامه عکسی را که ذخیره کرده نمایش نمیدهد بلکه عکس در لحظه آفریده میشود . یعنی شما اگر خط 11 ام برنامه را حذف کنید دیگر تصویری ذخیره نمیشود ولی هنوز نمایش داده میشود و با حذف خط 10 ام تصویر ذخیره میشود ولی نمایش داده نمیشود !

string str = "No QueryString Make one like (.../test.aspx?Hello )";
 if(Request.QueryString.Count >0 ) str = Request.QueryString[0];
 Bitmap mybmp =new System.Drawing.Bitmap(300,30);
 Graphics g = System.Drawing.Graphics.FromImage(mybmp);
 g.Clear(Color.Blue);
 Font myfont = new Font("Tahoma", 8, FontStyle.Bold);
 g.DrawString(str,myfont,Brushes.Yellow,9,8);
 Response.ContentType = "image/jpeg";
 mybmp.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);
 mybmp.Save(Server.MapPath("result.jpg"),System.Drawing.Imaging.ImageFormat.Jpeg);
 mybmp.Dispose();
 g.Dispose();

برنامه را اجرا کنید و از دات نت آبی لذت ببرید !

چهارشنبه، فروردین ۰۲، ۱۳۸۵

مشکل دیتابیس اکسز در asp.net

IISاز اول ریختم با همه چیز ور رفتم نشدpermission چیستتوروخدا کمک کنید....(یک سوال متداول !؟!)

.اینم ارورش:

 HTTP 500.100 - Internal Server Error - ASP errorInternet Information ServicesTechnical Information (for support personnel)Error Type:Microsoft JET Database Engine (0x80040E09) Cannot update. Database or object is read-only.

 یا اینکه ارورش اینه

Microsoft OLE DB Provider for ODBC Drivers error '80004005'[Microsoft][ODBC Microsoft Access Driver] Operation must use an updateable query. /tablename_edit.asp, line xxx

این یه مشکل خیلی معمول اه که دوستانی که تازه به یاد گرفتن asp و asp.net مشغول هستند با آن دست به گریبان اند و اما دلیل این مشکل چیست ؟؟ دلیل اینکه روی دیتا بیس اجازه خواندن داده میشود ولی اجازه نوشتن داده نمیشود این است که که هارد دیسک ntfs فرمت شده است و به همین دلیل باید پرمیشن را برای تمام دسترسی ها برای IIS تایید کرد (اگه قبلا این کار لازم نبود انجام بشه احتمالا برای این بوده که هارد دیسکت رو fat32 فرمت شده بوده ! ) راه حل برای ویندوز XP: پنجره my computer را باز کنید .منوی tools را پیدا کنید از آنجا بروید به Folder Options ، تب View بالا بکشید ؛ مطمئن شوید گزینه use simple file sharing(recommendedعلامت نخورده است (معمولا خط آخر ).توجه کنید که این گزینه به صورت پیش فرض علامت خورده است پس علامت آن را بردارید و ok کنید .

 Rooznamechi

 

روی فولدری که هاوی دیتابیس Microsoft Access شما ارست رایت کلید کنید ، وارد properties شوید ، متوجه خواهید شد که تب security نیز به تب های قبلی اضافه شده (به علت کاری که در مرحله قبل کردید).
 تب security را بالا بکشید ، دکمه add را فشار دهید ،کادری مقابل شما باز میشود با نام select users or Groups دکمه advanced را در قسمت پایین سمت چپ فشار دهید (کادر بزرگتر میشود ) دکمه find Now را فشار دهید تا لیست پر شود ، از لیست ASP.Net Machine Account را پیدا کنید روی کلیک کنید و دکمه ok را بزنید ، ASP.Net Machine Account به کادر قبلی اضافه میشود آن را انتخاب کنید . در قسمت Allow روبه روی full Control را علامت بزنید ، دکمه ok را بزنید و مشکل شما حل شده است !
 و اما اگر مشکل شما این است :

 The Microsoft Jet database engine cannot open the file آدرس دیتابیس . It is already opened exclusively by another user, or you need permission to view its data.

 ابتدا مطمئن شوید که دیتابیس شما در زمان اجرا در میکروسافت اکسز باز نیست !

واما اگر روی  لوکال وب سایت شما کار میکند ولی روی اینترنت فقط میتوانید از دیتابیس بخوانید وای اجازه نوشتن را روی دیتابیس اکسز خود ندارید بهترین کار این است که با مسئول پشتیبانی هاستنگ خود تماس بگرید و نحوه تعریف permission  اه write  را روی هاست خود جویا شوید ( هر هاست نحوه مخصوص به خود را دارد ، گاها شما از طریق کنترل پنل میتوانید این پرمشین را تعریف کنید و گاهی نمیتوانید ! )