PDA

View Full Version : سوال: ایجاد یک کامپوننت ( کمک فوری )



بانوآفتاب
یک شنبه 30 فروردین 1388, 00:48 صبح
سلام خدمت همه دوستان
من میخوام یک TextBox ی داشته باشم که فقط عدد بگیره ( تا اینجاش حله ) حالا میخوام اینو 1 کامپوننت کنم، که 2 تا Property اضافه بر Property های TextBox داشته باشه، یکی اینکه چه مدی باشه، مثلاً فقط عدد بگیره یا 3 رقم 3 رقم هم جدا کنه و دومیش مقدار عددی رو برگردونه منظور وقتی هست که تو مد 3رقمی 3 رقمی هست، کسی میتونه منو راهنمایی کنه که چطور باید شروع کنم؟ چطور این کامپوننت رو ایجاد کنم؟ باید یک User Control باشه؟ از 1 نفر شنیدم باید یک Web Control بگیرم ولی توی .net همچین چیزی ندیدم :اشتباه:
ممنون میشم راهنماییم کنید

khaste_007
یک شنبه 30 فروردین 1388, 02:14 صبح
با سلام شما می توانید از web user control و یا از custom control استفاده کنید که احتمالا استفاده از user control برای شما راحتر خواهد بود البته شرح آن طولانیت و شما می توانید برای این منظور از کتاب هایی که در مورد asp.net می باشد استفاده کنید.

بانوآفتاب
یک شنبه 30 فروردین 1388, 02:31 صبح
ممنون دوست عزیز
شما کتابی را میشناسید ( فارسی ) که اینو خوب توضیح داده باشه، چون من خیلی فوری نیاز دارم توی کتابی که خودم دارم ( قمی ) چیزی دربارش نداشت
بازم ممنون

Alireza Orumand
یک شنبه 30 فروردین 1388, 09:22 صبح
سلام
زیاد کار رو سخت نگیرید. کافیه یه کلاس درست کنید که از textbox ارث بری میکنه. بعد دوتا property که نیاز دارید بهش اضافه کنید.

public class NumericTextbox : TextBox
}
public int prop1{get;set;}
public int prop2{get;set;}
{
حالا اگر این کلاس رو کامپایل کنید به جعبه ابزارتون کنترل اضافه میشه و در لیست propertyهاش این دوتا property جدید اضافه بر property های پیش فرض textbox وجود داره.
میمونه افزودن کد های جاوااسکریپتی که خودتون میخاید.
باید متد OnPreRender رو override کنید و به کمک ClientScript کد ها رو اضافه کنید. میتونید به کمک شرط if و property هایی که تعریف کردید این کار رو انجام بدید.
کد زیر هم یه مثال هست که من از codeproject قدیما گرفتم. یه NumericTextbox به شما میده. من همیشه همین مثال رو برای کارهای خودم customize میکنم.


using System;
using System.ComponentModel;
using System.Web.UI.WebControls;
namespace Lib.Web
{
public class NumericTextbox : TextBox
{
[Browsable(false)]
public override string Text
{
get { return base.Text; }
set { base.Text = value; }
}
[Description ("The integer value of the NumericTextBox")]
public int Value
{
get
{
int ret;
// If text cannot be parsed as integer, return zero
// otherwise return the parsed integer
if (!int.TryParse(Text,out ret))
return 0;
return ret;
}
set { Text = value.ToString(); }
}
protected override void OnPreRender(EventArgs e)
{
string scriptName = "ValidationScript";
if (!Page.ClientScript.IsClientScriptBlockRegistered( scriptName))
Page.ClientScript.RegisterClientScriptBlock(Page.G etType(),
scriptName,
"<script language=\"javascript\">" +
" function IsNumeric(e,elem) {" +
" var currentText = elem.value; " +
" if(window.event)" + // MSIE
" {" +
" keynum = e.keyCode;" +
" }" +
" else if(e.which)" + // Netscape/Firefox/Opera
" {" +
" keynum = e.which;" +
" }" +
" return (keynum >= 48 && keynum <= 57) " + // allow numeric keys
" || (keynum == 45 && currentText == '') " + // allow '-' only if it's the first char
" || (keynum == 8) || (keynum == 127); " + // allow delete and backspace keys
" } </script>");
Attributes.Add("onKeyPress", "return IsNumeric(event,this)");
base.OnPreRender(e);
}
}
}

به کتاب فارسی هم درباره این تیپ کارها فکر نکنید که نیست. انتشارات wrox یه کتاب در این زمینه داره. کتاب Pro asp.net wrox هم یه فصل در این مورد داره.
موفق باشید

بانوآفتاب
یک شنبه 30 فروردین 1388, 16:50 عصر
ممنون از کمکتون، واقعاً کمکم کرد، ولی 1 موضوعی و اونم اینکه چطوری این کلاس را کامپایل کنم ( من توی وب تازه کارم :خجالت:)
Source رو میزارم شاید به درد کسی بخوره و حتماً کسی میتونه راهنماییم کنه که چطور این کلاس را dll کنم که بتونم همه جا ازش استفاده کنم.
ممنون



using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace Numeric_TextBox
{
public class NumericTextBox_Class : TextBox
{
//*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. *.*.*.*.*.*.*.*.*.*.*.*.*.*
public enum NumericTextBoxMod
{
Numeric = 1, Currency = 2
}
//*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. *.*.*.*.*.*.*.*.*.*.*.*.*.*
private NumericTextBoxMod _mod;
public NumericTextBoxMod mod
{
get
{
return this._mod;
}
set
{
this._mod = value;
}
}
//*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. *.*.*.*.*.*.*.*.*.*.*.*.*.*
public string value
{
get
{
if (base.Text.Trim() != String.Empty)
return Double.Parse(base.Text).ToString();
else return String.Empty;
}
}
//*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. *.*.*.*.*.*.*.*.*.*.*.*.*.*
protected override void OnPreRender(EventArgs e)
{
string scriptName = "ValidationScript";
string clientScript;
if (!Page.ClientScript.IsClientScriptBlockRegistered( scriptName))
{
clientScript = "<script language=\"javascript\" type=\"text//javascript\">" +
"function CheckNumericKeyInfo($char, $mozChar) {" +
"if($mozChar != null) { // Look for a Mozilla-compatible browser" +
"if(($mozChar >= 48 && $mozChar <= 57) || $mozChar == 0 || $char ==" +
"8 || $mozChar == 13) $RetVal = true;" +
"else {" +
"$RetVal = false;" +
"}" +
"}" +
"else { // Must be an IE-compatible Browser" +
"if(($char >= 48 && $char <= 57) || $char == 13) $RetVal = true;" +
"else {" +
"$RetVal = false;" +
"}" +
"}" +
"return $RetVal;" +
"}";
if (this._mod == NumericTextBoxMod.Currency)
{
clientScript = clientScript +
"function money2num(money){" +
"var num=money.replace(/,/g,'');" +
"return num;" +
"}" +
"function num2money(num){" +
"num=money2num(num);" +
"var le=num.length;" +
"var money='';" +
"var c=0;" +
"for(a=le-1;a>=0;a--){" +
"c++;" +
"if(c%3==1 && c>1) theChar=','; else theChar='';" +
"money=num.substr(a,1)+theChar+money;" +
"}" +
"return money;" +
"}";
}
clientScript = clientScript + "</script>";
Page.ClientScript.RegisterClientScriptBlock(Page.G etType(), scriptName, clientScript);
Attributes.Add("onkeypress", "return CheckNumericKeyInfo(event.keyCode, event.which);");
if (this._mod == NumericTextBoxMod.Currency)
{
Attributes.Add("onblur", "this.value=num2money(this.value);");
}
base.OnPreRender(e);
}
}
//*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*. *.*.*.*.*.*.*.*.*.*.*.*.*.*
}
}

Alireza Orumand
سه شنبه 01 اردیبهشت 1388, 13:46 عصر
سلام
ببینید یه پروژه از نوع ِClass Library به solution اضافه کنید و این این کلاس رو به اون پروژه اضافه کنید و بعد Compile کنید. وقتی به این DLL از پروژه وب Reference میدید به ابزار های داخل Toll box یه کنترل جدید که شما نوشتید اضافه میشه. به همین سادگی.
راستی به خاطر کلاسی که اینجا گذاشتید ممنون ولی اگه یکی دوتا تغییر جزئی بدید خیلی بهتر میشه.
اول اینکه اگه توی Propertyها کار خاصی انجام نمیدید میتونید اونا رو به صورت auto implement استفاده کنید و دیگه نیازی به متغیر محلی mod_ ندارید.
در ضمن زمانی که شما از یه Property استفاده میکنید بهتره داخل کلاس هم برای استفاده از Field متناظر با اون Propertye از همون Propertye استفاده کنید تا اگر Checking خاصی نیاز بود که در Propertye پیاده سازی شده بود لحاظ بشه. پس بهتره به جای چک کردن شرط

if(this._mode)
از

if(this.mode) استفاده کنید.
موفق باشید.