I put a list box and an image box.
now I want the image to swap every time the user clicks on a different element in the list. It doesnt seem to work
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
string[] pictures = { "~/createWii.jpg",
"~/DKC4_wii.png",
"~/Donkey-Kong-Country-1.jpg",
"~/DSCallOfDutyBlackOps.jpg",
"~/DSPreviewsCodmw2.jpg",
"~/DSPreviewsAliceInWonderLAnds.jpg",
"~/DSPreviewPicross3d.jpg",
"~/createii.jpg",
};
string[] picturesNames = { "picture1", "picture2", "picture3", "picture4", "picture5", "picture6", "picture7", "picture8" };
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < pictures.Length; i++)
{
ListBox1.Items.Add(new ListItem(picturesNames[i],pictures[i]));
}
Image1.ImageUrl = "~/Donkey-Kong-Country-1.jpg";
ListBox1.DataSource = picturesNames;
ListBox1.DataBind();
}
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Image1.ImageUrl = pictures[ListBox1.SelectedIndex];// it tells me that there is index out of range each time. why ?
}
}
A couple of things.
1.) you should wrap the code in page_load with
if(!IsPostback)
2.) Make sure on the .aspx that the "AutoPostback" property is set to true on the listbox!
Edit
Per the request in the comments, the reason this is needed is two fold.
ASP.NET ViewState will handle the persistence of the values on postback, therefore, you can use the !IsPostback condition to ensure that the information is only bound once. This prevents any "oddities" from coming up in the future.
By default ListBoxes/DropDownLists/etc do not post back automatically when the user changes a selection. So to actually trigger the event you either need to have a button that does the postback, or update the "AutoPostback" property as I directed to ensure that when the user makes a change that it triggers the server-side code.
Related
I am trying to bind information from a web service to a tree view in my asp.net website. Using a drop down list, I choose a stock symbol that retrieves that company's information from the web service. I am currently outputting that information as a string.
What I am trying to do is bind it to a tree view dynamically. This is where I'm at:
My aspx.cs file..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using net.webservicex.www;
using System.Xml;
public partial class _Default : System.Web.UI.Page
{
private net.webservicex.www.StockQuote StockQuote;
private string StockInfo;
private XmlDocument stockDoc = new XmlDocument();
protected void Page_Load(object sender, EventArgs e)
{
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
string symbol = DropDownList1.SelectedItem.Text;
StockQuote = new net.webservicex.www.StockQuote();
StockInfo = StockQuote.GetQuote(symbol);
stockDoc.LoadXml(StockInfo);
test.Text = StockInfo;
}
}
I cannot configure the data source in design view because it's dynamic, and I never used a hierarchical scheme. Do I need to do that? Is there another way?
Use an XmlDataSource and set it's DataFile property to the desired Xml file. Now go to your TreeView and set it's DataSourceID to the ID of XmlDataSource object.
Update
I just noticed that you are getting your Xml from a service. In that case use the Data property of XmlDataSource object to set the data xml.
Update
Declare your XmlDataSource in the aspx markup and set it as the DataSourceID of the TreeView (again in the markup). In the code behind (in an appropriate event), do something like below.
xmlDataSource.Data = StockInfo; // StockInfo is your string variable
treeView.DataBind(); // i am not sure whether this is necessary
Hope this helps.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication3
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
CustomValidator1.Validate();
}
protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
{
if (RadioButton1.Checked == false && RadioButton2.Checked == false)
args.IsValid = false;
else
args.IsValid = true;
}
}
}
Here is the code I used to program my server side custom validator. I'm having trouble understanding how this works because if I take it out of the IsPostBack "if", it shows up in the summary when I start up the page but when I click a button it doesn't work. Anyone know what might be wrong?
Also as some side info, what is the major difference between server side and client side validation in terms of this type of validation ?
The biggest difference betwen server side and client side validation (besides the obvious) is that client-side validation can prevent you from even submitting a page. Server-side validation only happens once the page has been submitted.
Mixing them can produce the situation where you, the user, have filled in all your fields, made everything the right length and value, and hit submit - and then when the page returns, there are more validation messages!
Yeah some people would say "Are you crazy using winforms controls inside asp forms"... and I think they are right. But I would say.. "I'm not the only one!!, take a look"
http://www.eggheadcafe.com/tutorials/aspnet/b7cce396-e2b3-42d7-9571-cdc4eb38f3c1/build-a-selfcaching-asp.aspx
So...
Doing some kind of stuff like the previous link. I did the following:
using System;
using System.Threading;
using System.Windows.Forms;
namespace XXXX.aspx.Print
{
public partial class Drucker : System.Web.UI.Page
{
private ManualResetEvent mre = new ManualResetEvent(false);
protected void Page_Load(object sender, EventArgs e)
{
Threading();
}
private void Threading()
{
Thread t = new Thread(new ThreadStart(GoAhead));
t.SetApartmentState(ApartmentState.STA);
t.Start();
mre.WaitOne();
t.Abort();
}
private void GoAhead()
{
DateTime time = DateTime.Now;
WebBrowser webBrowser = new WebBrowser();
webBrowser.Navigate(Request.UrlReferrer.ToString());
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
while (true)
{
Thread.Sleep(0);
TimeSpan elapsedTime = DateTime.Now - time;
if (elapsedTime.Seconds >= 13)
{
mre.Set();
}
System.Windows.Forms.Application.DoEvents();
}
}
void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser webBrowser = (WebBrowser)sender;
if (e.Url.AbsolutePath != webBrowser.Url.AbsolutePath) return;
webBrowser.Print();
}
}
}
Now...
the DocumentCompleted event is not fired (neither ProgressChanged) and I've tried the next:
Add the library MsHtml.dll to my project and place the file into my lib folder... I did it... No changes.
Try to handle the state of the WebBrowser.ReadyState... I did it... No changes (Actually after receive the WebBrowserReadyState.Complete I tried to print the document with
webBrowser.Print(); but I receive a weird IE pop up telling me: "'dialogArguments.__IE_PrintType' is Null or a not an object'"... ok so doing some research I got: a microsoft topic about dcomcnfg and some com security settings
I did it... No changes.
...
By the way I´m working in 64bits, Win7...
So before I format the whole computer...
Any suggestions?
WebBrowser is never inplace-activated by its ActiveX container, which you don't have. Try put it on a form first.
By the way, you know you are in the unsupported territory when you use WinInet, the network layer of webbrowser control, in a Windows Service, right?
I am looking for a way to programmatically set the OnClick event handler for a TableCell object. The ASP equivalent of what I'm trying to do will look like this:
<asp:TableCell OnClick="clickHandler" runat="server">Click Me!</asp:TableCell>
In the above example, "clickHandler" is a server-side function defined in the .cs CodeBehind.
public virtual void clickHandler(object sender, EventArgs args) {...}
However, for my situation, this TableCell object needs to be created dynamically, so setting it in an ASP tag is not an option. I am trying to do something like the following in the CodeBehind:
System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
System.Web.UI.WebControls.TableCell cell = new System.Web.UI.WebControls.TableCell();
cell.Text = "Click Me!";
cell.Attributes.Add("onClick", "clickHandler");
row.Cells.Add(cell);
Unfortunately, in this situation:
cell.Attributes.Add("onClick", "clickHandler");
the "clickHandler" only works as a client-side javascript function. What I'm looking for is a way to link the server-side clickHandler() function, defined in the .cs CodeBehind, to this table cell.
After an afternoon of searching, I have been unable to come up with a working solution. Thanks in advance for any help.
After a lot of work and research, I was able to cobble together a working solution, but it seems like an awful lot of work for something that should already be built-in. What I did was to extend the System.Web.UI.WebControls.TableCell object to include a handle for the OnClick event:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyWebApp
{
public class ExpandableTableCell : TableCell, IPostBackEventHandler, INamingContainer
{
private static readonly object click_event = new object();
public ExpandableTableCell()
{
}
// public handles for adding and removing functions to be called on the click event
public event EventHandler Click
{
add
{
Events.AddHandler(click_event, value);
}
remove
{
Events.RemoveHandler(click_event, value);
}
}
// define parent function that will be called when the container is clicked
protected void Click(EventArgs e)
{
EventHandler h = Events[click_event] as EventHandler;
if (h != null)
{
h(this, e);
}
}
// specify the "post back event reference" or id of the click event
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
Page.ClientScript.GetPostBackEventReference(this, "custom_click"));
}
// link the custom click id to the click function
void System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
{
if(eventArgument == "custom_click")
{
this.OnClick(EventArgs.Empty);
}
}
}
}
Here is how I use my new class (almost exactly like the stock TableCell):
System.Web.UI.WebControls.TableRow row = new System.Web.UI.WebControls.TableRow();
ExpandableTableCell click_cell = new ExpandableTableCell();
click_cell.Text = "Click Me!";
click_cell.Click += clickHandler;
// extra little touch for mouseover event
click_cell.Attributes.Add("onmouseover", "this.style.cursor='pointer'");
row.Cells.Add(click_cell);
As I have said, it seems like going through the trouble of extending the class to set the OnClick method in the codebehind is excessive. If anyone has any other ideas or any ways to clean up or legitimize the code above, please let me know.
I don't know if this is relevant to your problem, but I was trying to add a server-side function to a LinkButton and found the following (VB) code: AddHandler cell.Click, AddressOf clickHandler, which worked for me.
According to this code conversion service, this translates to cell.Click += clickHandler; in C#.
Hope this helps!
I can easily understand how to use custom events in pure C# code, but how can I do pass in custom event arguments on asp:button click?
I've tried all sorts of things (defining new event args, new delegates, etc etc) but I have had no luck.
Is there a tutorial of how to do this with the standard asp controls?
As long as your EventArgs inherit from System.EventArgs you will be able to pass them. Then, once inside your event handler, you can cast the event to the proper subtype.
Here is an example:
using System;
class Program
{
static event EventHandler Foo;
static void Main()
{
// Here is cast the EventArgs to FooEventArgs
Foo += (o,e) => Console.WriteLine(((FooEventArgs)e).Number);
// Notice that I am passing a "FooEventArgs" instance
// even though the delegate signature for "EventHandler"
// specifies "EventArgs". Polymorphism in action. :)
Foo(null, new FooEventArgs { Number = 1 });
}
}
class FooEventArgs : EventArgs
{
public int Number { get; set; }
}
I know that you are working with existing control delegates so unfortunately this kind of casting is neccessary. Keep in mind though that there is a EventHandler<T> where T : EventArgs delegate in .NET 2.0 and greater that will allow you to do what I have done above without casting.
I don't believe there is a way to do this without creating your own controls. However, I sometimes use the commandagument and commandname properties on a button to provide additional information
I don't thinks you can. The Button itself will be calling the Click event with it's own EventArgs object, and unfortunately you can't hijack that call. You can however use closures:
protected void Page_Load(object sender, EventArgs e)
{
int number = 1;
button.Click += (o, args) => Response.Write("Expression:"+number++);
number = 10;
button.Click += delegate(object o, EventArgs args) { Response.Write("Anonymous:"+number); };
}
By the way the output for this is Expression:10Anonymous:11 Understanding why this is the output is a big step into understanding closures! Even though number is out of scope when Click Event is handled, it is not destroyed because both of the defined event handler's have references to the it. So it and it's value will be maintained until it is no longer needed. I know that's not the most technical explanation of closures, but should give you an idea of what they are.