Row Autosize property not working of Table Layout? - c#

I am working on a windows application, in which i am using a table layout panel, in this table layout i have created 5 rows and that is autosize, now dynamically i am adding 4 radio buttons and text for radio button is a bit long but the problem is it is behaving like absolute and not showing the full text.
I am adding radio button like this-
for (int i = 0; i < 4; i++)
{
rbtn1 = new RadioButton();
rbtn1.Name = "rbtn" + (i + 1);
rbtn1.Text = "A jogger running at 9 kmph alongside a railway track in 280 metres ahead of the engine of a 120 metres long train running at 45 kmph in the same direction. In how much time will the train pass the jogger?";//ansList[i].ToString();
rbtn1.Dock = DockStyle.Fill;
rbtn1.Font = new Font("Verdana", 10);
tableLayoutExamPanel.Controls.Add(rbtn1, 1, i + 8);
}
I am working on this from last 10 hours.
Need help, Thanks a lot.

I realise this is an old question, however:
Set the dock style of each RadioButton to DockStyle.None
Set AutoSize = True for each RadioButton.
Autosize won't work if you have a dock style set. Make sure you the above is true for each child control on the table.

Try setting the radio buttons autosize property to true.
And remember that a control in a TableLayoutPanel cell always shrinks to fit in the cell until its MinimumSize is reached.
P.S. You could also try setting the AutoSizeMode property to GrowOnly.
See MSDN for more info
EDIT: try this...
.RowStyles.Clear();
.RowStyles.Add(new RowStyle(SizeType.AutoSize));

Related

Not being able to add large number of controls in a panel

I have a scenario in which I want to display numerous images in a panel using only horizontal scroll.
To enable only Horizontal Scroll only, I used the following code in the constructor
public Form()
{
InitializeComponent();
panelImageGallery.AutoScroll = true;
panelImageGallery.VerticalScroll.Enabled = false;
panelImageGallery.VerticalScroll.Visible = false;
}
And then to display and use images in the panel I wrote the following lines of code
int increment = 0;
lblCount.Text = "0/" + files.Length;
for (int i=0;i<files.Length;i++)
{
PanelPictureBox box = new PanelPictureBox();
box.IMAGE= files[i];
box.Location = new Point(panelImageGallery.Location.X + increment, panelImageGallery.Location.Y+10);
box.INDEX = i+1;
panelImageGallery.Controls.Add(box);
increment += 300;
}
Following is the result, and it can be seen that although, I have 350 images but NOT all images are in the panel as there are only 109 images and even both the horizontal and vertical scrolls are there.
Also, when I scrolled the panel all the way to the end then there are some display issues at the end too as the last image gets joined with the second last image.
Another thing that I observed was that when I increased the margin between the images, then fewer and fewer images got displayed inside the panel. So for example, when I set the increment to 500 then only 66 images got displayed in the panel instead of all the 350 images. My feeling is that there could be restriction on the maximum size of the panel, So what is actually happening here and how to resolve this issue ?
This is a limitation because of some of the Windows messages, for example as mentioned in documentations:
Note that the WM_HSCROLL message carries only 16 bits of scroll box
position data. Thus, applications that rely solely on WM_HSCROLL (and
WM_VSCROLL) for scroll position data have a practical maximum position
value of 65,535.
In general, it's not a good idea to try to host too many controls on the form.
In your case, you may want to try controls which performs automatic layout, like FlowLayoutPanel, TableLayoutPanel, Docking into the left of a panel or decrease the margin between your controls.
Or as a proper fix, you can rely on ListView control which support virtual mode, or implement a custom drawn control, or use paging to show a limited number of controls in each page.

How can I center a label in the middle of a panel in C#?

I am trying to make an Icon Generator Application in C#.
I have to panels, one that is in charge of the background colour (Border colour) and the other as foreground colour (Fill colour). I also have a label in the middle of the forgeground colour panel (Fill colour) see screenshots designer, application ran for first time, changed code using textbox and button (see arrow in screenshot)
I have tried using tablelayout panels and docking but it doesnt seem to work. I basically want to do what the designer align buttons do but through code.
Any help is greatly appriciated thanks!
Label myLabel;
Panel myPanel;
int x = (myPanel.Size.Width - myLabel.Size.Width) / 2;
int y = (myPanel.Size.Height - myLabel.Size.Height)/2;
label1.Location = new Point(x, y);

How can I keep two Winforms labels centrally aligned?

I'm trying to keep two labels centrally aligned, one above the other. Before the form runs, everything looks great, but when running they are all misaligned.
Before running:
After running:
Example code for one label:
Me.TemperatureLabel1.AutoSize = True
Me.TemperatureLabel1.BackColor = System.Drawing.Color.WhiteSmoke
Me.TemperatureLabel1.Font = New System.Drawing.Font("Bahnschrift", 25.0!)
Me.TemperatureLabel1.ForeColor = System.Drawing.Color.Gray
Me.TemperatureLabel1.Location = New System.Drawing.Point(278, 53)
Me.TemperatureLabel1.Name = "TemperatureLabel1"
Me.TemperatureLabel1.Size = New System.Drawing.Size(227, 41)
Me.TemperatureLabel1.TabIndex = 8
Me.TemperatureLabel1.Text = "TempLabelVal"
Me.TemperatureLabel1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
Me.TemperatureLabel1.Visible = False
So what I would like is to have the values populated, but centrally aligned above each other.
Set label's AutoSize property to false and TextAlign property to MiddleCenter.
As another option, you can use TableLayoutPanel having 4 columns and 2 rows. Then drop labels inside cells, set Anchor property of the Label controls to none and keep their AutoSize as true.
This way, the labels are always will be aligned in center of the cell.
It also allows you to have absolute, percent or auto-size mode for columns.

Strange Label AutoSize issue on TableLayoutPanel resize

Background:
I have a TableLayoutPanel placed in a UserControl, which then is placed in SplitContainer. Rows are added programmatically. TableLayoutPanel is anchored Top|Left|Right, so after rows are added, its height is recalculated and it expands downward.
Inside the TableLayoutPanel, there are two columns. The size of the first column is Absolute, the size of the second column is set to AutoSize.
In every cell, there is a Label. All labels in the second column are defined as follows:
Label vName = new Label();
vName.AutoSize = true;
vName.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
vName.Margin = new Padding(3);
vName.TextAlign = ContentAlignment.MiddleLeft;
vName.Name = "controlName";
vName.Text = "Some text here";
vName.DoubleClick += new EventHandler(vName_DoubleClick);
vName.Dock = DockStyle.None;
The problem:
Usually, everything works all right, labels resize and everything, except for one strange scenario:
The text of the label is something like "immoballizes the device (33.33%)", width of TableLauoutPanel's second column is set exactly, so all text is shown in one line.
Splitter distance changes by one pixel and the UserControl is resized: width decreases, so the label should resize, and the text in a label should wrap.
The label is not resized, and the second line of text isn't shown, it also probably doesn't wrap (there would be a change in the text location in the label if it did).
Splitter distance changes by one pixel again, and the UserControl is resized: the width decreases further.
The label resizes all right and all text is shown, wrapped.
The same thing happens when the TableLayoutPanel's width increases, but always only if there is a difference of one pixel (between wrapping/not wrapping text).
Also, changing Dock and/or Anchor and/or BorderStyle properties of labels doesn't work (I probably tried all possible combinations...)
This picture illustrates the issue a little:
Apparently it is a label issue: when autosizing, it wasn't measuring text correctly and sometimes there was a one pixel difference. I've found a strange workaround, though, if someone knows something better please enlighten me.
This way text in my labels wraps correctly every time and everything is autosized properly:
void tableLayoutPanel1_Resize(object sender, EventArgs e)
{
float fWidth = tableLayoutPanel1.GetColumnWidths()[1];
foreach (Control ctr in tableLayoutPanel1.Controls)
{
if (ctr is Label && ctr.Name.Contains("vName_"))
{
// -7 for margins
Size s = TextRenderer.MeasureText(ctr.Text, ctr.Font, new Size((int)fWidth - 7,1000),
TextFormatFlags.VerticalCenter
| TextFormatFlags.Left
| TextFormatFlags.NoPadding
| TextFormatFlags.WordBreak);
if(!ctr.MaximumSize.Equals(s))
ctr.MaximumSize = new Size(s.Width, s.Height);
}
}
}

How to resize a button depending on its text

In the process of translating an application with C# + Winforms, I need to change a button's text depending on the language.
My problem is the following :
Let's say I want to translate a button from "Hi all!" to "Bonjour tout le monde" !
As you can guess, the button's size won't be the same if I enter english text or french one... My question is "simple", how can I manage to resize the button on the fly so the text fits its content in the button ?
So far I got something like that !
[Hi all!]
[Bonjour]
There's absolutely no need to use the underlying Graphics object as the other posters have said.
If you set the button's AutoSize property to true, the AutoSizeMode to GrowAndShrink, and the AutoEllipsis to false, it will resize automatically to fit the text.
That being said, you may need to make several layout adjustments to make this change fit into your UI. You can adjust the button's padding to add space around the text, and you may want to place your buttons in a TableLayoutPanel (or something) to stop them from overlapping when they resize.
Edit:
#mastro pointed out that: AutoEllipsis is only valid when AutoSize is false (As explained in the documentation), so it can be safely ignored as long as the other three properties are set correctly.
Your best bet is to set the AutoSize property as described ach's answer
However if AutoSize isn't working for you, resizing the button in code is easy enough. You can just need to set the button's width. The trick is making it big enough to fit your text.
using(Graphics cg = this.CreateGraphics())
{
SizeF size = cg.MeasureString("Please excuse my dear aunt sally",this.button1.Font);
// size.Width+= 3; //add some padding .net v1.1 and 1.0 only
this.button1.Padding = 3;
this.button1.Width = (int)size.Width;
this.button1.Text = "Please excuse my dear aunt sally";
}
Try this:
Button.AutoSize = true;
Button.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly;
Button.TextAlign = ContentAlignment.MiddleLeft;
Button.Padding = new Padding(0, 0, 0, 0);
To enable a Button in WinForms grow and/or shrink depending on the size of the Text, you need to set the button's AutoSize property to True and the AutoSizeMode property to GrowAndShrink.
// C#
btn.AutoSize = true;
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink;
' VB.NET
btn.AutoSize = True
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink
Please note that the AutoSize property will only allow the button's size to grow if the AutoSizeMode property is set to GrowOnly; by changing the AutoSizeMode property to GrowAndShrink, the button will now automatically extend or reduce in width and height based on its Text property.
Also note that in setting the two properties as shown above, you can make use of new lines (Environment.NewLine or vbCrLf) in the Text property and the button will scale down as needed.
As Andrew Hanlon explains, you can set AutoSize = true.
When doing so, you can also attain a perfect layout of the buttons automatically by placing them on a FlowLayoutPanel.
The horizontal distance between them will always stay the same when the FlowDirection of the FlowLayoutPanel is LeftToRight or RightToLeft. You can adjust this distance by setting the Margin property of the buttons appropriately. You can create groups of buttons by increasing the left margin of buttons beginning a new group.
If you set the Dock property of the buttons to DockStyle.Fill, they will even grow their width automatically in order to fit to the widest button if the FlowDirection of the FlowLayoutPanel is TopDown or BottomUp.
btn.AutoSizeMode = AutoSizeMode.GrowOnly;
btn.AutoSize = true;
btn.Dock = DockStyle.Fill;
In addition to setting the AutoSize to true and the AutoSizeModeto GrowAndShrink, as suggested in the other answers, you may also need to set the TextImageRelation property, if you have set the button image, so that the text doesn't overlap the image.

Categories

Resources