martedì 24 agosto 2010

FlowLayoutPanel C#

Avete mai provato a usare questo splendido controllo ?? Io mi sto divertendo proprio ora ad usare uno strumento javesco in c#...
Non so effettivamente chi abbia fatto il primo passo con questo tortuoso strumento .. tuttavia lo trovo discretamente pratico, nel caso si debba ricorrere ad array di controlli... e gestirne il riposizionamento dopo la rimozione di uno o più elementi.

Nel mio caso sto cercando di realizzare un Tab control un po più ricercato e customizzabile di quello proposto nel VS 2008 che devo dire fa pure il suo porco mestiere... ma lascia poco spazio alla fantasia.

Ora imbattendomi in questo controllo speravo di trovare fra le properties qualcosa di utile.. stile grip / grid size.. ma nulla.

Scopro e mi pare carino condividere che "non esiste nulla di cio'" tuttavia lo spazio fra un controllo e l'altro all'interno del FlowLayoutPanel è demandato alla proprietà margin dei controlli che sta usando... o impilando.

Bene quindi ricordate che se usate :
Button myButton = new Button();
myButton.Text = "My Button";
flpMain.control.Add(myButton);
di aggiungere
myButton.Margin= new Padding(0, 0, 0, 0);

Attenzione MARGIN è una struct e non è del tutto accessibile..

lunedì 16 agosto 2010

ConfigurationManager Add Key & Value...

Sempre a me...?? ma perchè quando voglio fare qualcosa io .. becco sempre qualche sfiga strana..

System.Configuration.Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

config.AppSettings.Settings.Remove(settingName);

config.AppSettings.Settings.Add(settingName, settingValue);

config.Save(ConfigurationSaveMode.Modified);

ConfigurationManager.RefreshSection("appSettings");

Questo effettivamente più che un add.. è un Edit, ma non è questo il vero problema... anzi...
In questo breve brano di codice sono emerse ben 2 cose...

A) in debug mode... non funzionerà e potrete tentarci quanto vorrete... ma non andrà... questo
perche ????
- Semplice in debug non accedete al vero app config... ma all' [Applicativo].vshost.exe.config...

Sembra facile ma non è difficile.. c'e' un motivo più che semplice, non modificare nulla, nel caso
l'exe originale ( ma perchè ??? ) fosse nella stessa cartella... ( qualcuno in m.s. si droga ).

B) a runtime va...

C) Lo sapevate che ...
In proprietà del vostro applicativo c'e' una voce chiamata... AssemblyName...
scrivete li dentro il nome del vostro "exe"...ehm...
poi Andate su assembly information (sempre da proprietà ) e modificate la voce
product.. in modo che sia diverso del vostro nome "exe"...
ED ECCO CHE APPARE UN ALTRO [nome prodotto].vshost.exe.config... !!
Vuoto naturalmente...

Ora... Ora... e ancora ora ... mi pare lecito avere tante possibilità .. ma dai un cotrollino sui nomi,
lo si poteva anche mettere no ???

martedì 10 agosto 2010

Array di bottoni ?? eccolo...

Osservando le statistiche mi sono accorto che molti arrivano sul mio sito cercando "ARRAY di Bottoni"...

Ora posto che questo ricerca sia molto vicina a come creare un array di controlli, mi sembra carino pubblicare il seguente brano di codice che da qualche lume sull'argomento.

Anche se onestamente sconsiglio questa pratica.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

public class ButtonArrayController
{
Button[] _buttons = new Button[4];

public void CreateControlList()
{
_buttons = new Button[4];

_buttons[0] = new Button(); // create a new item
_buttons[0].Text = "New";
_buttons[0].Click += new EventHandler(ButtonArrayController_Click);

_buttons[1] = new Button(); // edit element (select to edit)
_buttons[1].Text = "Edit";
_buttons[1].Click += new EventHandler(ButtonArrayController_Click);

_buttons[2] = new Button(); // delete element (select to delete)
_buttons[2].Text = "Delete";
_buttons[2].Click += new EventHandler(ButtonArrayController_Click);

_buttons[3] = new Button(); // commit from new and edit
_buttons[3].Text = "Save";
_buttons[3].Click += new EventHandler(ButtonArrayController_Click);
}

public void SetStatus(int status)
{
for (int i = 0; i < 4; i++) { _buttons[0].Enabled = false; }

switch (status)
{
case 0: { _buttons[0].Enabled = true; break; } // init
case 1: { _buttons[1].Enabled = true; _buttons[2].Enabled = true; break; } // from grid click
case 2: { _buttons[3].Enabled = true; break; } // after case 0 or 1
}
}


public void ButtonArrayController_Click(object sender, EventArgs e)
{
// do action here..
}
}


Ad ogni modo un array di controlli in c# è un array e non quella strana situazione che creava VB6, tanto comoda quanto rischiosa.