Programim dhe zhvillim, javascript, python, php, html

Si të përdorni skedarë të veçantë .cs në C#?

Forum; Unë jam një fillestar që përpunoj pak kod. Do të doja të dija mënyrën më të mirë për të përdorur skedarë të veçantë .cs që përmbajnë klasa dhe funksione të tjera. Si shembull i një funksioni bazë, do të dëshironit të klikoni në një buton të pastër dhe ta pastroni të gjitha fushat në një formular. Kodi është i ndarë në tre skedarë .cs. Main.cs, MainForm.Designer.cs dhe btClear.cs.

MainForm.Designer.cs përmban kodin e krijuar automatikisht nga projektuesit duke përfshirë butonin Clear dhe kutitë e tekstit që do të doja të fshija.

Do të doja të kisha kodin për të pastruar kutitë e tekstit të përfshira në btClear.cs. Unë e kuptoj se do të ishte e lehtë të vendosej thjesht këtë kod në MainForm.Designer.cs, megjithatë unë do të doja ta përdorja këtë si një shabllon për të përdorur skedarë të veçantë .cs si një praktikë standarde.

A mund të më japë dikush një shembull se si ta bëj këtë, ju lutem?

c#
21.02.2009

Përgjigjet:


1

Mënyra se si shumica e programuesve .net do ta bënin këtë është:

  • Lëreni të gjithë kodin tuaj brenda MainForm.cs, por deklaroni një metodë të re për ndarjen e kodit që bën pastrimin.

Unë gjithmonë lë në metodën e menaxhimit të ngjarjeve (ajo që VS gjeneron kur klikoni dy herë butonin) kodin për të ndryshuar kursorin e miut (në rast se kodi që po telefonoj kërkon disa sekonda ose më shumë për t'u ekzekutuar) dhe për t'i kapur të gjitha të patrajtuara përjashtime dhe vendos logjikën time në një metodë të veçantë private:

partial class MainForm : Form // this is MainForm.cs
{
    // This is the method VS generates when you double-click the button
    private void clearButton_Click(object sender, EventArgs e)
    {
        this.Cursor = Cursors.WaitCursor;
        try
        {
            ClearForm();
        }
        catch(Exception ex)
        {
            // ... have here code to log the exception to a file 
            // and/or showing a message box to the user
        }
        finally
        {
            this.Cursor = Cursors.Default;
        }
    }

    private void ClearForm()
    {
        // clear all your controls here
        myTextBox.Clear();
        myComboBox.SelectedIndex = 0;
        // etc...
    }
}

Sipas mendimit tim, nëse doni të ndiqni mënyrën konvencionale të të bërit të gjërave në .net, duhet t'i përmbaheni këtij shembulli të parë.

Rekomandohet zhvendosja e kodit jashtë skedarëve .cs kur kodi nuk është pjesë e logjikës së formularit, për shembull, kodi i hyrjes në të dhënat ose logjika e biznesit. Në këtë rast nuk mendoj se pastrimi i kontrolleve të formularit kualifikohet si logjikë biznesi. Është vetëm një pjesë e kodit të formularit dhe duhet të qëndrojë në MainForm.cs.

Por nëse vërtet dëshironi të vendosni metodën ClearForm në një skedar tjetër .cs, mund të krijoni një klasë të re dhe të zhvendosni metodën ClearForm atje. Do t'ju duhet gjithashtu të ndryshoni veçorinë Modifiers të çdo kontrolli në Publik, në mënyrë që klasa juaj e re të ketë qasje në to nga jashtë MainForm. Diçka si kjo:

public class FormCleaner // this is FormCleaner.cs
{
    public void ClearForm(MainForm form)
    {
        // clear all your controls here
        form.myTextBox.Clear();
        form.myComboBox.SelectedIndex = 0;
        // etc...
    }
}

Ju do të duhet të ndryshoni kodin kryesor të formës në:

partial class MainForm : Form // this is MainForm.cs
{
    // This is the method VS generates when you double-click the button
    private void clearButton_Click(object sender, EventArgs e)
    {
        this.Cursor = Cursors.WaitCursor;
        try
        {
            FormCleaner cleaner = new FormCleaner();
            cleaner.ClearForm(this);
        }
        catch(Exception ex)
        {
            // ... have here code to log the exception to a file 
            // and/or showing a message box to the user
        }
        finally
        {
            this.Cursor = Cursors.Default;
        }
    }
}

Por vini re se klasa juaj FormCleaner duhet të dijë për klasën tuaj MainForm në mënyrë që të dijë se si të pastrojë secilën nga kontrollet e formularit, ose do t'ju duhet të gjeni një algoritëm të përgjithshëm që është në gjendje të qarkullojë përmes koleksionit Controls të çdo formë për t'i pastruar ato:

public class FormCleaner // this is FormCleaner.cs
{
    // 'generic' form cleaner
    public void ClearForm(Form form)
    {
        foreach(Control control on form.Controls)
        {
            // this will probably not work ok, because also
            // static controls like Labels will have their text removed.
            control.Text = "";
        }
    }
}

Dhe siç kanë thënë të tjerët, MainForm.Designer.cs është krijuar nga makineritë dhe nuk duhet të vendosni kurrë kodin tuaj atje.

21.02.2009
  • E shënova këtë si përgjigje sepse më dukej më e plota. Megjithatë, duket se është e qartë se skedarët e veçantë .cs zakonisht nuk funksionojnë siç mendoja unë. Faleminderit për edukimin! 21.02.2009

  • 2

    Ju mund të përdorni një klasë partial për klasën tuaj MainForm, pasi tashmë është duke u bërë në MainForm.cs dhe MainForm.Designer.cs.

    btnClear.cs

    public partial class MainForm
    {
       private void clearForm(object sender, EventArgs e)
       {
         // ...
       }
    }
    

    Dhe regjistrohu për ngjarjen në MainForm.cs ose MainForm.Designer.cs

    this.btnClear.click += clearForm;
    

    Redakto:

    Nëse dëshironi një mënyrë të përgjithshme për ta bërë këtë, mund të vendosni Tag vetia e kontrolleve tuaja të jetë vlera e paracaktuar. Dhe me një metodë zgjerimi, mund të bëni diçka si formGroup.Reset();

    using System.Windows.Forms;
    
    public class ControlExtensions
    {
      public void Reset(this Control control)
      {
        if (control.Tag != null)
        {
          if (control is TextBoxBase && control.Tag is string)
          {
            control.Text = control.Tag as string;
          }
          else if (control is CheckBox && control.Tag is bool)
          {
            control.Checked = control.Tag as bool;
          }
          // etc
        }
    
        foreach (Control child in control.Children)
          child.Reset();
      }
    }
    
    21.02.2009
  • Unë nuk mendoj se kjo adreson vërtet atë që ai kërkon. 21.02.2009
  • ClearForm nuk shfaqet në kontekstin aktual në MainForm. Si ta rregulloj këtë? 21.02.2009

  • 3

    Një klasë për skedar .cs është një rregull i mirë për t'u ndjekur.

    Unë nuk do ta ndaja funksionalitetin specifik të faqes në skedarë të veçantë .cs, përveç nëse planifikoni të kapsuloni në një klasë të ripërdorshme.

    Redakto:

    Vendosni funksionin e pastrimit në ngjarjen OnClick të butonit. Nuk ka arsye për ta ndarë këtë.

    skedari .aspx:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SimpleWebTest._Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="ClearButton" runat=server onclick="ClearButton_Click" Text="Button" />
        </div>
        </form>
    </body>
    </html>
    

    skedari .cs

    using System;
    
    namespace SimpleWebTest
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e) { }
    
            protected void ClearButton_Click(object sender, EventArgs e)
            {
                using (ComplexOperationThingy cot = new ComplexOperationThingy())
                {
                    cot.DoSomethingComplex();
                }
            }
        }
    }
    

    ComplexOperationThingy.cs:

    using System;
    
    namespace SimpleWebTest
    {
        public class ComplexOperationThingy
        {
            ComplexOperationThingy() { }
    
            public void DoSomethingComplex()
            {
                //Do your complex operation.
            }
        }
    }
    
    21.02.2009
  • Jam dakord me këtë, por po pyes më shumë për mënyrën se si. 21.02.2009
  • Po mendoja ta përdorja këtë si një shabllon për operacione më komplekse 21.02.2009

  • 4

    Është mjaft e thjeshtë për t'u bërë. Në skedarin tuaj btClear.cs thjesht gjeneroni një përkufizim të klasës si:

    public class MyUtility
    {
        public static void ClearContents(IEnumerable<Control> controls)
        {
            //TODO: Code that clears contents of controls passed
        }
    }
    

    Pastaj mund ta telefononi nga kudo që të referohet hapësira e emrave në të cilën ndodhet klasa e gjeneruar përmes:

    MyUtility.ClearContents(SomeControlCollection);
    

    Shpresoj se nuk e kam humbur plotësisht shenjën në qëllimin tuaj.

    21.02.2009

    5

    Në përgjithësi, nuk duhet ta vendosni kodin tuaj në skedarin MainForm.designer.cs. Skedarët *.designer.cs përdoren nga Visual Studio për të lidhur të gjithë hidraulikun e lodhshëm të kontrolleve të vendosura në të vërtetë në formular.

    Çdo kod që dëshironi të përdorni për të bashkëvepruar me kontrollet në formular duhet të shkojë në skedarin MainForm.cs. Pra, nëse dëshironi një funksion për të pastruar kontrollet në formular, atëherë duhet të vendosni kodin atje.

    Nëse kodi që po shkruani fshin kontrollet në formular është i ripërdorshëm në projekte të tjera, atëherë duhet ta vendosni në një skedar tjetër .cs që mund të lidhet me projekte të tjera.

    Siç tha Chris, përgjithësisht vendosja e një klase për skedar .cs është gjithashtu një ide e mirë. Kur ta bëni këtë, skedari duhet të ketë emrin e klasës që përmban. Pra, nëse keni një klasë të quajtur MyButtonHelpers, atëherë skedari burimor duhet të quhet MyButtonHelpers.cs.

    21.02.2009

    6

    Mendoj se është më mirë të mos e modifikosh drejtpërdrejt skedarin .Designer.cs, veçanërisht nga pikëpamja e Kontrollit të Burimit. Ju mund të përdorni klasa të pjesshme për të përmbajtur kodin e lidhur me ju; në këtë rast, ju mund të përdorni MainForm.Designer.cs si një shembull se si të realizoni klasa të pjesshme (p.sh. klasa e pjesshme MainForm{}).

    Nëse po shtoni mbajtës të ngjarjeve përmes Windows Forms Designer, ai duhet t'i vendosë automatikisht në MainForm.cs, jo në MainForm.Designer.cs. Nëse projekti rritet në ndonjë madhësi të konsiderueshme, shpesh më duket e dobishme krijimi i skedarëve të shumtë të klasës së pjesshme, një për çdo grup të madh funksionaliteti. Kjo e bën shumë më të lehtë gjetjen e një funksioni të caktuar (dhe funksioneve të lidhura me to).

    21.02.2009

    7

    Konventa në C# (dhe shumë gjuhë të tjera) është një skedar për klasë (dhe zakonisht një klasë për skedar). Sigurisht që ka përjashtime nga ky rregull, por ndarja e një klase të vetme nëpër skedarë të shumtë duhet të jetë një dukuri e rrallë, jo një praktikë standarde.

    Ju përmendët në një koment se parashikoni më shumë "operacione komplekse" sesa shembulli që dhatë. Çfarë lloj operacionesh po parashikoni? Për sa kohë që po flisni vetëm për trajtimin e kontrolleve të formularit, logjika i përket skedarit .cs për formularin (në këtë rast, MainForm.cs, dhe jo MainForm.designer.cs - si të tjerët kanë thënë, ju nuk duhet të modifikoni kurrë skedarin .designer).

    Nëse forma juaj po bëhet shumë e ndërlikuar, atëherë mund të ketë kuptim ta ndani atë në kontrollet me porosi. Kjo do t'ju lejojë t'i mbani skedarët tuaj burimor më të vegjël, por (meqenëse çdo "Kontroll" është hartuar në një klasë) ju do t'i përmbaheni konventës së një klase ‹-> një skedari.

    21.02.2009
    Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..