Domanda

Ho un'applicazione Windows Form in cui ho diviso funzionalità diverse in diversi controlli utente. Voglio ognuno di questi controlli utente di avere un pulsante di accettare.

Le eventuali buone pratiche qui?

La mia idea è quella di rilevare che il controllo utente che ha il focus, e poi metterlo nel form padre.

altre idee?

È stato utile?

Soluzione

Jan Miksovsky ha un ottimo blog sul design dell'interfaccia utente, e scrisse un articolo su questa cosa molto .

  

La maggior parte delle piattaforme di interfaccia utente consentono al progettista di   indicare quale pulsante in una finestra   dovrebbe essere il pulsante di default: il   tasto che verrà premuto se la   utente digita il tasto Invio. Il predefinito   pulsante è generalmente il pulsante   utente è più probabile che premere il prossimo,   spesso un pulsante mi piace OK che chiude la   dialogo. In finestre di dialogo molto alto traffico,   si può prendere in considerazione in modo dinamico   cambiare il tasto predefinito per salvare   battiture e di aiuto di velocità per l'utente   compito.

L'esempio che usa la finestra di dialogo "Seleziona nomi" in Microsoft Outlook, che cambia il pulsante di default a seconda di cosa si sta facendo.

Altri suggerimenti

La pratica migliore è di solito di avere solo un pulsante accettare per il modulo in modo che il suo comportamento è coerente. E 'generalmente sarebbe fonte di confusione per gli utenti se il ritorno di colpire causato azioni diverse a seconda di quale parte del modulo aveva messa a fuoco. Tuttavia, se si dispone di un'applicazione specializzata o utenti hanno richiesto questa funzionalità allora penso che la soluzione che proponete avrebbe funzionato.

Presumo ogni pulsante utente è la propria istanza sui singoli controlli utente?

Se è così allora è possibile intercettare il pulsante eventi sul form padre. Se si espongono i singoli tasti attraverso una proprietà che si può legare nei loro eventi Click. Come tutti i controlli hanno una proprietà nome in modo da poter avere un metodo che viene chiamato su tutti gli eventi clic del pulsante.

Qui di seguito ho un codice di esempio parziale. Ho due controlli utente che dispongono di un pulsante ciascuno. Il pulsante sul UC1 si chiama "btn1" e "btn2" per UC2. Chiamo la proprietà esposta "ButtonOK"

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn1; }
    }
}

public partial class UserControl2 : UserControl
{
    public UserControl2()
    {
        InitializeComponent();
    }

    public Button ButtonOK
    {
        get { return btn2; }
    }
}

Ora sul genitore ( "Form1") quando carica hanno un mthod che riallaccia gli eventi Click di ciascun pulsante, ma chiama lo stesso metodo. All'interno del metodo che prova per la proprietà "Name".

    public Form1()
    {
        InitializeComponent();
    }

    void Form1_Load(object sender, EventArgs e)
    {
        RegisterButtonEvents();
    }

    void RegisterButtonEvents()
    {
        userControl11.ButtonOK.Click += new EventHandler(ButtonOK_Click);
        userControl21.ButtonOK.Click += new EventHandler(ButtonOK_Click);
    }

    void ButtonOK_Click(object sender, EventArgs e)
    {
        Button btn = sender as Button;
        if (btn != null)
        {
            if (btn.Name == "btn1")
            {
                Console.WriteLine(" ButtonOK from UserControl1 was pushed. The tag is " + btn.Tag.ToString());
            }
            else if (btn.Name == "btn2")
            {
                Console.WriteLine(" ButtonOK from UserControl2 was pushed. The tag is " + btn.Tag.ToString());
            }
        }
    }

È anche possibile all'utente la "Tag" proprietà di un controllo. Questa proprietà può essere molto utile in quanto si può fare riferimento agli oggetti.

Non è necessario fare esattamente come indicato, ma è possibile utilizzare qualsiasi forma "genitore" per ottenere un riferimento ai controlli utente, li hanno esporre i loro pulsanti, allora si può fare tutto quello che vuoi con le proprietà e gli eventi di quei pulsanti (o qualsiasi controllo per quella materia).

Tieni presente che se si sta legando nell'evento click sul controllo utente anche (oltre alla forma del genitore), si dovrà essere consapevoli dell'ordine in cui sarà enumerare essa elenco dei delegati ed eseguire codice dopo l'evento è intiated.

La speranza che aiuta.

So che questo è un vecchio post, ma penso di aver capito.

Utilizzare l'evento "Enter" a ogni controllo utente dal modulo principale, tale che quando l'utente "entra" (si concentra sulla) controllo utente, this.AcceptButton = myUserControlButton. È inoltre possibile utilizzare l'evento "Lasciare" su ogni controllo all'utente di impostare il pulsante di accettazione al valore predefinito, se ne avete uno.

Forse non la migliore pratica (ma simile al metodo di cui sopra) di solito faccio in questo modo:

private void ButtonClick(object sender, EventArgs e)
{
 Button btn = (Button)sender;

swithch(btn.Name)
{
case "button1": /* Do Something Here */ break;
case "button2": /* Do Something Here */ break;
// etc
}
}

Inoltre; se necessario (come detto sopra) c'è sempre il modo per recuperare il pulsante al di fuori della classe form esponendoli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top