A
Alani
Hello All,
I'm a new ASP.NET programmer and I want to create a custom control
consist of two properties (Number1) and (Number2) and both of them are
integers and default value = 0,
now I'm using callback technique so I can change those two proprties
via ChangeNumber1 and ChangeNumber2 functions.
what happens is that when I change the Number1 for to number and get
the result of the callback event and trying to change the second number
I always get the default value of Number1 (which is 0) and always the
result return 0;
I know that I can pass the two new properties value via the callback
function but I want it works like this.
anybody can help ?
========================================================================
My Custom Contorl code is:
[ToolboxData("<{0}:MyCalculator runat=server></{0}:MyCalculator>")]
public class MyCalculator : WebControl, ICallbackEventHandler
{
private const int _number1Default = 0;
private const string _number1DefaultViewState = "Number1";
[Bindable(true)]
[DefaultValue(_number1Default)]
[Description("The first number")]
[Localizable(true)]
public int Number1
{
get
{
object obj = ViewState[_number1DefaultViewState];
return (obj != null) ? (int)obj : 0;
}
set
{
ViewState[_number1DefaultViewState] = value;
}
}
private const int _number2Default = 0;
private const string _number2DefaultViewState = "Number2";
[Bindable(true)]
[DefaultValue(_number2Default)]
[Description("The first number")]
[Localizable(true)]
public int Number2
{
get
{
object obj = ViewState[_number2DefaultViewState];
return (obj != null) ? (int)obj : 0;
}
set
{
ViewState[_number2DefaultViewState] = value;
}
}
protected override void OnPreRender(EventArgs e)
{
ClientScriptManager csm = this.Page.ClientScript;
{ // Number1 Script Register
String cbNumber1Ref = csm.GetCallbackEventReference(this,
"eventArgument",
"GetMultiplyResult", "context");
StringBuilder sbNumber1CallbackScript = new
StringBuilder();
sbNumber1CallbackScript.Append("\n");
sbNumber1CallbackScript.Append("function
ChangeNumber1(eventArgument, context)\n");
sbNumber1CallbackScript.Append("{\n");
sbNumber1CallbackScript.Append(" " + cbNumber1Ref);
sbNumber1CallbackScript.Append(";\n}");
// Register script blocks will perform call to the server.
if (!csm.IsClientScriptBlockRegistered(this.GetType(),
"OnChangeNumber1"))
{
csm.RegisterClientScriptBlock(this.GetType(),
"OnChangeNumber1",
sbNumber1CallbackScript.ToString(), true);
}
}
{ // Number2 Script Register
String cbNumber2Ref = csm.GetCallbackEventReference(this,
"eventArgument",
"GetMultiplyResult", "context");
StringBuilder sbNumber2CallbackScript = new
StringBuilder();
sbNumber2CallbackScript.Append("\n");
sbNumber2CallbackScript.Append("function
ChangeNumber2(eventArgument, context)\n");
sbNumber2CallbackScript.Append("{\n");
sbNumber2CallbackScript.Append(" " + cbNumber2Ref);
sbNumber2CallbackScript.Append(";\n}");
// Register script blocks will perform call to the server.
if (!csm.IsClientScriptBlockRegistered(this.GetType(),
"OnChangeNumber2"))
{
csm.RegisterClientScriptBlock(this.GetType(),
"OnChangeNumber2",
sbNumber2CallbackScript.ToString(), true);
}
}
}
public override void RenderControl(HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.B);
writer.Write("This is My Control");
writer.RenderEndTag();
}
private int _result;
void ICallbackEventHandler.RaiseCallbackEvent(string
eventArgument)
{
string[] args = eventArgument.Split(':');
switch (args[0])
{
case "Number1":
{
Number1 = int.Parse(args[1]);
}
break;
case "Number2":
{
Number2 = int.Parse(args[1]);
}
break;
}
_result = Number1 * Number2;
}
string ICallbackEventHandler.GetCallbackResult()
{
return _result.ToString();
}
}
========================================================================
And the page that uses it is:
========================================================================
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="WebControlLibrary1"
Namespace="WebControlLibrary1" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function OnChangeNum1()
{
var cmb1 = document.getElementById("Select1");
ChangeNumber1(cmb1.selectedIndex);
}
function OnChangeNum2()
{
var cmb2 = document.getElementById("Select2");
ChangeNumber2(cmb2.selectedIndex);
}
function GetMultiplyResult(mulResult)
{
document.getElementById("Text1").value = mulResult;
}
</script>
<script src="ClientScript.js" type="text/javascript">
// <!CDATA[
// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<br />
<strong>First Number :</strong>
<select id="Select1" onchange="OnChangeNum1()" style="width:
121px" onclick="return Select1_onclick()">
<option selected="selected">0</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<br />
<strong>Second Number:</strong> <select id="Select2"
onchange="OnChangeNum2()" style="width: 121px">
<option selected="selected">0</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select><br />
<br />
<strong>Result:</strong>
<input id="Text1" type="text" style="width: 170px" /><br />
<br />
<cc1:MyCalculator ID="MyCalculator1" runat="server"
Width="257px" />
</div>
</form>
</body>
</html>
========================================================================
Thanks
Omar alani
I'm a new ASP.NET programmer and I want to create a custom control
consist of two properties (Number1) and (Number2) and both of them are
integers and default value = 0,
now I'm using callback technique so I can change those two proprties
via ChangeNumber1 and ChangeNumber2 functions.
what happens is that when I change the Number1 for to number and get
the result of the callback event and trying to change the second number
I always get the default value of Number1 (which is 0) and always the
result return 0;
I know that I can pass the two new properties value via the callback
function but I want it works like this.
anybody can help ?
========================================================================
My Custom Contorl code is:
[ToolboxData("<{0}:MyCalculator runat=server></{0}:MyCalculator>")]
public class MyCalculator : WebControl, ICallbackEventHandler
{
private const int _number1Default = 0;
private const string _number1DefaultViewState = "Number1";
[Bindable(true)]
[DefaultValue(_number1Default)]
[Description("The first number")]
[Localizable(true)]
public int Number1
{
get
{
object obj = ViewState[_number1DefaultViewState];
return (obj != null) ? (int)obj : 0;
}
set
{
ViewState[_number1DefaultViewState] = value;
}
}
private const int _number2Default = 0;
private const string _number2DefaultViewState = "Number2";
[Bindable(true)]
[DefaultValue(_number2Default)]
[Description("The first number")]
[Localizable(true)]
public int Number2
{
get
{
object obj = ViewState[_number2DefaultViewState];
return (obj != null) ? (int)obj : 0;
}
set
{
ViewState[_number2DefaultViewState] = value;
}
}
protected override void OnPreRender(EventArgs e)
{
ClientScriptManager csm = this.Page.ClientScript;
{ // Number1 Script Register
String cbNumber1Ref = csm.GetCallbackEventReference(this,
"eventArgument",
"GetMultiplyResult", "context");
StringBuilder sbNumber1CallbackScript = new
StringBuilder();
sbNumber1CallbackScript.Append("\n");
sbNumber1CallbackScript.Append("function
ChangeNumber1(eventArgument, context)\n");
sbNumber1CallbackScript.Append("{\n");
sbNumber1CallbackScript.Append(" " + cbNumber1Ref);
sbNumber1CallbackScript.Append(";\n}");
// Register script blocks will perform call to the server.
if (!csm.IsClientScriptBlockRegistered(this.GetType(),
"OnChangeNumber1"))
{
csm.RegisterClientScriptBlock(this.GetType(),
"OnChangeNumber1",
sbNumber1CallbackScript.ToString(), true);
}
}
{ // Number2 Script Register
String cbNumber2Ref = csm.GetCallbackEventReference(this,
"eventArgument",
"GetMultiplyResult", "context");
StringBuilder sbNumber2CallbackScript = new
StringBuilder();
sbNumber2CallbackScript.Append("\n");
sbNumber2CallbackScript.Append("function
ChangeNumber2(eventArgument, context)\n");
sbNumber2CallbackScript.Append("{\n");
sbNumber2CallbackScript.Append(" " + cbNumber2Ref);
sbNumber2CallbackScript.Append(";\n}");
// Register script blocks will perform call to the server.
if (!csm.IsClientScriptBlockRegistered(this.GetType(),
"OnChangeNumber2"))
{
csm.RegisterClientScriptBlock(this.GetType(),
"OnChangeNumber2",
sbNumber2CallbackScript.ToString(), true);
}
}
}
public override void RenderControl(HtmlTextWriter writer)
{
writer.RenderBeginTag(HtmlTextWriterTag.B);
writer.Write("This is My Control");
writer.RenderEndTag();
}
private int _result;
void ICallbackEventHandler.RaiseCallbackEvent(string
eventArgument)
{
string[] args = eventArgument.Split(':');
switch (args[0])
{
case "Number1":
{
Number1 = int.Parse(args[1]);
}
break;
case "Number2":
{
Number2 = int.Parse(args[1]);
}
break;
}
_result = Number1 * Number2;
}
string ICallbackEventHandler.GetCallbackResult()
{
return _result.ToString();
}
}
========================================================================
And the page that uses it is:
========================================================================
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="WebControlLibrary1"
Namespace="WebControlLibrary1" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function OnChangeNum1()
{
var cmb1 = document.getElementById("Select1");
ChangeNumber1(cmb1.selectedIndex);
}
function OnChangeNum2()
{
var cmb2 = document.getElementById("Select2");
ChangeNumber2(cmb2.selectedIndex);
}
function GetMultiplyResult(mulResult)
{
document.getElementById("Text1").value = mulResult;
}
</script>
<script src="ClientScript.js" type="text/javascript">
// <!CDATA[
// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<br />
<strong>First Number :</strong>
<select id="Select1" onchange="OnChangeNum1()" style="width:
121px" onclick="return Select1_onclick()">
<option selected="selected">0</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<br />
<strong>Second Number:</strong> <select id="Select2"
onchange="OnChangeNum2()" style="width: 121px">
<option selected="selected">0</option>
<option>1</option>
<option>2</option>
<option>3</option>
</select><br />
<br />
<strong>Result:</strong>
<input id="Text1" type="text" style="width: 170px" /><br />
<br />
<cc1:MyCalculator ID="MyCalculator1" runat="server"
Width="257px" />
</div>
</form>
</body>
</html>
========================================================================
Thanks
Omar alani