Vra

Ek moet die hoogte van elke teksboks stel op my vorm, waarvan sommige geneste binne ander beheermaatreëls. Ek het gedink ek kon so iets te doen:

private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)
{
    foreach (Control control in rootControl.Controls)
    {
        if (control.Controls.Count > 0)
        {
            // Recursively search for any TextBoxes within each child control
            foreach (TextBox textBox in FindTextBoxes(control))
            {
                yield return textBox;
            }
        }

        TextBox textBox2 = control as TextBox;
        if (textBox2 != null)
        {
            yield return textBox2;
        }
    }
}

Die gebruik van dit soos volg:

foreach(TextBox textBox in FindTextBoxes(this))
{
    textBox.Height = height;
}

Maar natuurlik die samesteller spoeg sy dummy, omdat foreach verwag 'n IEnumerable in plaas van 'n IEnumerator .

Is daar 'n manier om dit te doen sonder om 'n aparte klas te skep met 'n GetEnumerator () metode?

Was dit nuttig?

Oplossing

As die samesteller is wat jy vertel, moet jy jou terugkeer tipe verander na IEnumerable. Dit is hoe die opbrengs terugkeer sintaksis werk.

Ander wenke

Net om te verduidelik

private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)

Wysigings aan

private static IEnumerable<TextBox> FindTextBoxes(Control rootControl)

Dit moet almal: -)

As jy IEnumerator terugkeer, sal dit 'n ander opnemer voorwerp elke keer noem dat metode (waarnemende asof jy die opnemer op elke iterasie herstel) wees. As jy IEnumerable dan terug 'n foreach kan opsom gebaseer op die metode met die opbrengs verklaring gesê.

// Generic function that gets all child controls of a certain type, 
// returned in a List collection
private static List<T> GetChildTextBoxes<T>(Control ctrl) where T : Control{
    List<T> tbs = new List<T>();
    foreach (Control c in ctrl.Controls) {
        // If c is of type T, add it to the collection
        if (c is T) { 
            tbs.Add((T)c);
        }
    }
    return tbs;
}

private static void SetChildTextBoxesHeight(Control ctrl, int height) {
    foreach (TextBox t in GetChildTextBoxes<TextBox>(ctrl)) {
        t.Height = height;
    }
}

As jy kry 'n opnemer, en moet dit gebruik in 'n vir-elke lus, kan jy gebruik maak van die volgende om dit toe te draai:

static public class enumerationHelper
{
    public class enumeratorHolder<T>
    {
        private T theEnumerator;
        public T GetEnumerator() { return theEnumerator; }
        public enumeratorHolder(T newEnumerator) { theEnumerator = newEnumerator;}
    }
    static enumeratorHolder<T> toEnumerable<T>(T theEnumerator) { return new enumeratorHolder<T>(theEnumerator); }
    private class IEnumeratorHolder<T>:IEnumerable<T>
    {
        private IEnumerator<T> theEnumerator;
        public IEnumerator<T> GetEnumerator() { return theEnumerator; }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return theEnumerator; }
        public IEnumeratorHolder(IEnumerator<T> newEnumerator) { theEnumerator = newEnumerator; }
    }
    static IEnumerable<T> toEnumerable<T>(IEnumerator<T> theEnumerator) { return new IEnumeratorHolder<T>(theEnumerator); }
}

Die toEnumerable metode sal enigiets aanvaar wat sou 'n aanvaarbare opbrengs tipe van beskou GetEnumerator, en iets wat gebruik kan word in foreach terugkeer. As die parameter is 'n IEnumerator<> sal die reaksie 'n IEnumerable<T> wees, al is 'n beroep GetEnumerator op dit eens waarskynlik slegte resultate sal oplewer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top