Picturebox and button click - winforms

Ran into a confusing problem. I need to make a fishtank in Windows forms. Every time a button is clicked, a fish will appear. I thought about putting code in button_click function. The problem is that the picturebox with the image doesn't appear when I click the button.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BackColor = System.Drawing.Color.LightBlue;
}
private void button1_Click(object sender, EventArgs e)
{
//PictureBox pb = new System.Windows.Forms.PictureBox();
PictureBox pb = new PictureBox();
pb.Image = Image.FromFile("C:\\Users\\Elonas\\Desktop\\FishTank\\Photo\\Fish_right.png");
pb.Location = new Point(300, 300);
}
}
}

Every time you create a control (pb, in this case), you have to add it to the Controls collection of the form before you can see it.
You can also replace pb.image in the picturebox instead of creating a new picturebox every mouse click. You still need to add it to the form's controls collection when you create it as new (or create it in the Designer).

Ow so something like this? Is this one of the controls? Never was I introduced. I get the idea. Ill try to work with that.
pb.Location = new Point(300, 300);

Related

WPF Radio button does not update after several binding

I have an application that allows users to move forward and backward
And the radio button is implemented like following:
For the first 4 times, I change the selected item for the radio button and then move next and then come back and do the same, the radio buttons work fine and the model is updated correctly as its GUI. However, after the first 4 times moving forwards and backwards, the radio buttons do not update its GUI.
Following is the navigation system:
Model and view are bound based on Next/Back button
Check boxs works fine!
Please give me some suggestions.
Thanks in advance
I finally found the answer:
If you have tried to bind the RadioButton’s IsChecked property in WPF to an object, you have most likely experienced the following problem: In OneWay bindings it works great. But if you have more than one RadioButtons binded TwoWay and you click on an unchecked one, you were expecting that the object to which the previously checked RadioButton was binded to receive the value of False. But you were wrong in your expectations. That’s because for some reasons Microsoft does not obey bindings and does not pass the False value to the DependencyProperty and instead of that they just assign the value False directly to the property, which ruins the binding.
There are many proposed solutions to this around the internet, problem with all those is that they do not work with dynamically generated controls. So since I had to find a way to make this working with dynamic controls, decided to make a wrapper of the real RadioButton which will correctly Bind in two ways. Here is the code for the wrapper:
using System;
using System.IO;
using System.Printing;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using Microsoft.Win32;
namespace Controls
{
public class RadioButtonExtended : RadioButton
{
static bool m_bIsChanging = false;
public RadioButtonExtended()
{
this.Checked += new RoutedEventHandler(RadioButtonExtended_Checked);
this.Unchecked += new RoutedEventHandler(RadioButtonExtended_Unchecked);
}
void RadioButtonExtended_Unchecked(object sender, RoutedEventArgs e)
{
if (!m_bIsChanging)
this.IsCheckedReal = false;
}
void RadioButtonExtended_Checked(object sender, RoutedEventArgs e)
{
if (!m_bIsChanging)
this.IsCheckedReal = true;
}
public bool? IsCheckedReal
{
get { return (bool?)GetValue(IsCheckedRealProperty); }
set
{
SetValue(IsCheckedRealProperty, value);
}
}
// Using a DependencyProperty as the backing store for IsCheckedReal. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsCheckedRealProperty =
DependencyProperty.Register("IsCheckedReal", typeof(bool?), typeof(RadioButtonExtended),
new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.Journal |
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
IsCheckedRealChanged));
public static void IsCheckedRealChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
m_bIsChanging = true;
((RadioButtonExtended)d).IsChecked = (bool)e.NewValue;
m_bIsChanging = false;
}
}
}
So now all you have to do is to use the ExtendedRadioButton instead of the built-in one and bind to the IsCheckedReal property instead of the IsChecked one.
Enjoy 🙂

What are some common issues in a winform application for memory leaks?

I try to get to grasp with Ants Memory Profiler. The problem I have is that I dont have an easy application that has a memory leak.
I used the sample of Redgate (QueryBee), but it was to contreived for my taste. There has to be an easier app for that.
I tried to make one up but it is not working. It is not working means: I dont have a memory leak. I read about calling ShowDialog without disposing the called form would get me a memory leak, but thats not the case here.
I use VS2010 and .NET 4.0
I am especially interested in issues that are very common.
Here is what I have so far.Can you get me a memory leak?:
MainForm
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MemoryLeakTest
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SubForm formToCall = new SubForm();
formToCall.ShowDialog();
}
}
}
Subform
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace MemoryLeakTest
{
public partial class SubForm : Form
{
public SubForm()
{
InitializeComponent();
}
private void SubForm_Load(object sender, EventArgs e)
{
ArrayList persons = new ArrayList();
for (int i = 0; i <= 50000; i++)
{
var person = new {
Name = "1 SchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorschSchorsch",
LastName = "KluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluniKluni",
Age = 50,
City = "LondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondonLondon",
Zip = "223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301223012230122301",
Index = i
};
persons.Add(person);
}
dataGridView1.DataSource = persons;
}
private void SubForm_FormClosed(object sender, FormClosedEventArgs e)
{
//this.Dispose();
}
}
}
Add this to your SubForm
public void mouse_handler(object sender, MouseEventArgs e)
{
}
And change the MainForm to do this
private void button1_Click(object sender, EventArgs e)
{
SubForm formToCall = new SubForm();
this.MouseClick += new MouseEventHandler(formToCall.mouse_handler);
formToCall.ShowDialog();
}
Now it doesn't matter if you .Dispose() the SubForm or not, you will still have a "leak". Your MainForm keeps a reference to the SubForms indefinitely, through its mouse event handler, which is basically just a list of who is to receive the events, since that handler is never de-registered.
Ants will help you track down this, but rather manually, it'll show you objects still being alive and referenced from the root, and you have to discover that these objects should not referenced anywhere. I believe Ants also can generate warnings/etc. when it finds objects that have been .Disposed(), but are still referenced somewhere.

RoutedEventArgs error

Basically a RoutedEvent travels through the Logical tree, either from top to bottom (Bubble event route) or bottom to top (Tunnel event route).
What this means is that if you have a Button inside of a StackPanel, that itself is inside of a Grid;
if you define a Click event in the controls they will all trigger it unless one of them handles it.
In my application I have:
Button -> StackPanel -> Grid
If it’s true, that StackPanel and Grid will not trigger it.
Grid -> StackPanel -> Button
if the Grid handles it, the StackPanel and Button will not trigger it.
in my application i wrote:
private void Button_Click(object sender, RoutedEventArgs e) {
Response.Redirect("http://www.legalbill.com");
}
it gave this-
Error - The name 'Response' does not exist in the current context …
what it means n how will i move to desired site?
Are you sure you are trying to do this in wpf ? If you are trying in silverlight,It doesn't support Response.Redirect.You can use like this
using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
namespace Tips
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// execute one of them.
HtmlPage.Window.Navigate(new Uri(“http://www.silverlight.net“));
HtmlPage.Window.Navigate(new Uri(“http://www.silverlight.net“), “_blank”);
HtmlPage.Window.Navigate(new Uri(“http://www.silverlight.net“), “_blank”, “toolbar=0″);
}
}
}

screenshot of a winforms control through C#

Is it possible to get a screenshot of a control in winforms without actually displaying it on the screen? How about a webBrowser component?
Yes. This can be done.
I whipped up a sample program to do it. Forgive my naming conventions and code organization, this was whipped up very quickly. You can modify it to better fit your needs, but this shows the basics.
I have a single form with three controls:
button1: Button with the default settings.
button2: Button with the Visible property set to false and the Text set to "button2 - not visible"
webBrowser1: WebBrowser control with the visibility set to false, set the size to 250, 101 (just so it fits on my form. The size is relevant when you look at the capture at the bottom of my answer. You'll need to size it accordingly.)
here's the code in Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
PrintInvisibleControl(button2, #"C:\button.jpg");
PrintInvisibleControl(webBrowser1, #"C:\webbrowser.jpg");
}
private void PrintInvisibleControl(Control myControl, string filename)
{
Graphics g = myControl.CreateGraphics();
//new bitmap object to save the image
Bitmap bmp = new Bitmap(myControl.Width, myControl.Height);
//Drawing control to the bitmap
myControl.DrawToBitmap(bmp, new Rectangle(0, 0, myControl.Width, myControl.Height));
bmp.Save(filename, ImageFormat.Jpeg);
bmp.Dispose();
}
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("http://www.microsoft.com");
}
}
}
This resulted in the following captures:

c#: Window Forms: Retrieve child control values from unactivated tab

I have a winform with a tab control. On the default tab I have a 'go' button tied to a function that retrieves the values from textboxes on the second tab(default values).
The values come up as "" if I don't first look at the 2nd tab which i'm guessing causes the textboxes to be poulated with the default values.
How do I make the form fill all it's controls on load?
Data Binding doesn't work on invisible control. I found it here. For reference look at this MSDN thread
This works like a charm:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
ComboBox c = new ComboBox();
Button b = new Button();
public Form1()
{
InitializeComponent();
b.Text = "New Button";
b.Click += new EventHandler(b_Click);
this.tabPage1.Controls.Add(b);
c.Items.Add("Hello World");
c.Items.Add("My Program");
c.SelectedIndex = 0;
this.tabPage2.Controls.Add(c);
}
void b_Click(object sender, EventArgs e)
{
MessageBox.Show(c.Text.ToString());
}
}
}
If not specified at load time the combox listindex defaults to -1 which is "" (blank) so if you know the exact index at which your default values get displayed in the combo box then set the listindex to that index.
Using the code below the first item in the combobox will get selected at run time.
comboBox1.SelectedIndex = 0 (The first item in the combo box)

Resources