2013-02-25 8 views
5

Ich habe die folgenden zwei Button-Klick-Methoden, die ein Array aus drei TextBoxen erstellen, ordnen Sie die Werte, fügen Sie sie in eine Datenbank und wählen Sie dann die Werte in der gleichen Reihenfolge. Der einzige Unterschied zwischen den beiden Knöpfen ist, dass man die Werte in aufsteigender Reihenfolge und die andere in absteigender Reihenfolge sortiert.Structuring Button Klick-Methoden, um Code-Wiederholung zu vermeiden

Ich bin nicht gewohnt, mit C# zu arbeiten. Kann jemand den besten Weg vorschlagen, meinen Code zu strukturieren, damit ich ihn nicht für jeden Knopf wiederhole? Normalerweise würde ich eine Funktion schreiben und jede Taste Argumente übergeben. Ist das der richtige Weg dorthin?

Vielen Dank im Voraus.

Button1

protected void Button1_Click(object sender, EventArgs e) 
{ 
    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text }; 
    var orderedlist = list.OrderBy(x => (x)).ToArray(); 

...

SqlCommand cmd = new SqlCommand("Select * from lists order by values asc", conn); 

Button2

protected void Button2_Click(object sender, EventArgs e) 
{ 
    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text }; 
    var orderedlist = list.OrderByDescending(x => (x)).ToArray(); 

...

+2

Verwenden Sie eine Funktion, rufen Sie sie von beiden Schaltflächen mit unterschiedlichen Argumenten. –

+1

Vielleicht ein wenig mehr Code oder eine Erklärung, was die Tasten tun? Von dem, was Sie zur Verfügung gestellt haben, würde ich denken, dass ein Funktionsaufruf mit Argumenten am besten wäre, aber es könnte andere (bessere) Optionen geben. – Chuck

Antwort

5

Sie könnten einfach beide Button Click-Ereignisse auf den gleichen Handler zuweisen und die sender wählen, welche Sortierung Sie möchten.

protected void Button_Click(object sender, EventArgs e) 
{ 
    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text }; 
    var orderedlist = (sender as Button).AccessKey == "Button1" // or whatever name it is 
         ? list.OrderByDescending(x => (x)).ToArray() 
         : list.OrderBy(x => (x)).ToArray(); 

    ............. 
} 
+0

+1 Objekt Absender wird nicht genug verwendet! –

+0

Vielen Dank. :) Das einzige Problem ist jetzt "System.Web.UI.WebControls.Button" enthält keine Definition für 'Name' und keine Erweiterungsmethode 'Name' akzeptiert ein erstes Argument vom Typ 'System.Web.UI.WebControls'. Button 'könnte gefunden werden (fehlt dir eine using-Direktive oder eine Assembly-Referenz?) " – user1405195

+0

vielleicht funktioniert' AccessKey' in der Form von Name oder einer anderen Eigenschaft, die zwischen den beiden Buttons eindeutig ist –

2

On Option wäre, eine Funktion zu erstellen, zu sortieren:

public list sort(String order) 
{ 
    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text }; 
    var orderedlist = list.OrderByDescending(x => (x)).ToArray(); 
    ... 

    SqlCommand cmd = new SqlCommand("Select * from lists order by values " + order, conn) 
    ... 
    return SortedList; 
} 

Anruf sort ("asc"), um die sortierte Liste in aufsteigender Reihenfolge zu erstellen, und zu sortieren ("desc") zu sortieren absteigend Auftrag. Und keine Code-Wiederholung :)

0

Sie könnten grundsätzlich funktionale Programmierung hier verwenden. Abstrakt den Teil des Codes, der sich in eine Funktion verwandelt.

protected void Button1_Click(object sender, EventArgs e) 
{ 
    HelperFunction(list => list.OrderBy(x => x)); 
} 

protected void Button2_Click(object sender, EventArgs e) 
{ 
    HelperFunction(list => list.OrderByDescending(x => x)); 
} 

private void HelperFunction(Func<IEnumerable<string>, <IEnumerable<string>> listOrderer) 
{ 
    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text }; 

    var orderedList = listOrderer(list).ToArray(); 

    // rest of code 
} 
Verwandte Themen