Avatar billede koppelgaard Praktikant
13. oktober 2009 - 22:36 Der er 18 kommentarer og
1 løsning

Datagridview opdatere ikke

Jeg har et datagridview med tilhørende datatable som datasource der ikke opdatere efter addning af datarow.
Data kommer fra vægt ved at sende command til vægt og afvente at eventen
"private void DataRecieved(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)"
kører.
Alt vedrørende comportkommunikation er lagt i en selvstændig klasse, som sender data til datatable.

Imidlertid sker der ikke nogen synlig opdatering i datagridview'et før at jeg gennemtvinger et repaint af formen( som køres fra en commandbuttom)

Eventen "private void dataGridView1_RowsAdded", som ligger i formen, kører heller ikke.

Hvor kan fejlen lægge?
Avatar billede sirius Nybegynder
14. oktober 2009 - 09:11 #1
Tror ikke at din datagridview selv kan fange at der sker ændringer bag om ryggen på den.

Du kunne evt. kalde Refresh på datagridviewet når du tilføjer en række til den datatable som er datasource, så slipper du for at have en knap til at opdatere.
Avatar billede bvli Praktikant
14. oktober 2009 - 11:25 #2
Jo - DataGridView fanger selv ændringer i den bagvedliggende datasource. Har du sat dit gridviews DataSource til at være din DataTable?

Hvordan tilføjer du rows til din datatable?

Det er nok nødvendigt at se noget kode, for at komme meget videre.

En hurtig test viser, at det udmærket kan lade sig gøre:

using System;
using System.Windows.Forms;
using System.Data;

namespace B.Testing {

    public class TestForm : Form  {
        DataGridView dgv;
        DataTable dt;
        int rowCount;

        public TestForm() {
            Button b = new Button();
            b.Text = "&Add row";
            b.Click += bClick;
            b.Dock = DockStyle.Bottom;
            Controls.Add(b);

            dgv = new DataGridView();
            dgv.Dock = DockStyle.Fill;
            Controls.Add(dgv);
        }

        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            dt = new DataTable("TestTable");
            dt.Columns.Add("TestColumn1");
            dt.Columns.Add("TestColumn2");
            dgv.DataSource = dt;
        }

        private void bClick(object sender, EventArgs e) {
            DataRow r = dt.NewRow();
            r[0] = "Column 1, row " + rowCount;
            r[1] = "Column 2, row " + rowCount;

            rowCount++;
            dt.Rows.Add(r);
        }

        [STAThread]
        static void Main()
        {
            Application.Run(new TestForm());
        }
    }
}
Avatar billede koppelgaard Praktikant
14. oktober 2009 - 15:38 #3
Meget glad for, at der er en der byder ind med hjælp!!!
Der er noget forståelsesmæssigt, jeg ikke har styr på, om events.

Først en dumt spørgsmål.Hvis jeg skal prøve din kode, hvad skal jeg så paste den ind i? Er det en 'windows form application' eller....?

Jeg sender noget kode senere.

Michael
NB: har opdaget, at jeg har stillet spørgsmålet to gange. De må så bare være 2*100 for et svar :-)
Avatar billede bvli Praktikant
14. oktober 2009 - 15:52 #4
Hvis du vil prøve koden kan du gøre en af to ting:

1) Åbn en Visual Studio command prompt.
  Gem koden i en fil (f.eks. TestForm.cs)
  I din VS command prompt skriv: "csc TestForm.cs"
  Nu har du en TestForm.exe du kan køre.

2) Lav et nyt winforms projekt i visual studio.
  Slet filerne Form1.cs og Program.cs
  Lav en ny klasse (TestForm) og kopier koden ind.
  Hit F5

Men som sagt - lad os se noget af din kode - måske er det bare en eller anden dødsyg fodfejl.
Avatar billede koppelgaard Praktikant
14. oktober 2009 - 16:51 #5
Har lagt koden på
http://www.mediafire.com/?munjnnty0yh
men lægger den også ud her. Øjeblik.....

Michael
Avatar billede koppelgaard Praktikant
14. oktober 2009 - 17:03 #6
Programmet skal hente data fra 5 vægte via 5 comporte.
Programmet fejler ved opstart, hvis disse ikke findes.
Analysen hedder Ksat derfor klassen KsatClass som er tænkt som en slags controller.
Data lægges tilføjes en datatable som er source i til et datagridview. Data skulle visualiseres ved zedgrafer ved at eventeren rowadded kører.
Datatable datagridview og zedgraph  er knyttet sammen i  klassen zedview hvor eventene også oprettes:
---------------------------------------------------------------------------------------------------------------------------------------------

using System;
using ZedGraph;
using System.Data;
using System.Windows.Forms;
using System.Drawing;


namespace Ksat
{
    class ZedView
    {
        DataTable dt;
        DataGridView dgw;
        ZedGraphControl zgc;
        PointPairList list;

        public ZedView(DataGridView dtw, ZedGraphControl zgc)
        {
            this.dt = new DataTable();           
            this.dgw = dtw;
            this.zgc = zgc;

            dt.Columns.Add("Time");
            dt.Columns.Add("Minuts");
            dt.Columns.Add("Weight");
            dt.Columns.Add("Flow");         
         
            dtw.DataSource = dt;
            dtw.Columns[0].Width = 50;
            dtw.Columns[1].Width = 50;
            dtw.Columns[2].Width = 50;
            dtw.Columns[3].Width = 50;

            CreateGraph(zgc);

            this.dgw.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(dgw_RowsAdded);
            this.dgw.RowsRemoved += new System.Windows.Forms.DataGridViewRowsRemovedEventHandler(dgw_RowsRemoved);

        }
        public DataTable dataTable
        {
            get { return dt; }
        }


        public DataGridView dataGridView
        {
            get { return dgw; }
        }

        public ZedGraphControl zedGraphControl
        {
            get { return zgc; }
        }

        private void dgw_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            try
            {
                list.RemoveAt(e.RowIndex);
                zgc.AxisChange();
                zgc.Invalidate();
            }
            catch { }
        }
        private void dgw_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            try
            {
                int x = Convert.ToInt32(dt.Rows[e.RowIndex][0]);
                int y = Convert.ToInt32(dt.Rows[e.RowIndex][2]);
                list.Add(x, y);
                zgc.AxisChange();
                zgc.Invalidate();

            }
            catch { }
        }
        public void AddRow(string fak1,string fak2,string fak3,string fak4)
        {
          int t= dt.Columns.Count;
         
            DataRow dr = dt.NewRow();
         

            dr["Time"] = fak1;
            dr["Minuts"] = fak2;
            dr["Weight"] = fak3;
            dr["Flow"] = fak4;
            dt.Rows.Add(dr);
            dt.AcceptChanges();
            //dtw.Refresh();Fejler
          // ((FormMain)dtw.Parent).Refresh();fejler
        }
        private void CreateGraph(ZedGraphControl zgc)
        {
            GraphPane myPane = zgc.GraphPane;

            myPane.Title.Text = "My Test Graph";
            myPane.XAxis.Title.Text = "X Value";
            myPane.YAxis.Title.Text = "My Y Axis";

            list = new PointPairList();
            LineItem myCurve = myPane.AddCurve("My Curve", list, Color.Blue, SymbolType.Circle);
            myCurve.Symbol.Fill = new Fill(Color.White);
            myPane.Chart.Fill = new Fill(Color.White, Color.LightGoldenrodYellow, 45F);
            myPane.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45F);
        }

    }
}
---------------------------------------------------------------------------------------------------------------------------------------------

Klassen der snakker med comportene kommer her (vægtene er af mærket Sartorius, derfor navnet):
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace Ksat
{
    class Sartorius
    {
        SerialPort port;     
        private string data;     
        KsatClass ksat;
        FormMain f;       
     

        public Sartorius(string portName, int dataBits, Parity parity, int baudRate, FormMain f)
        {
            port = new SerialPort(portName,baudRate,parity,dataBits);
         
            port.Handshake = Handshake.None;           
            port.DtrEnable = true;
            port.ReceivedBytesThreshold = 1;
            port.ReadBufferSize = 4096;
            port.ReadTimeout = 100;         
            port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.DataRecieved);
            port.Open();                   
           
            this.f = f;         
        }
        public KsatClass Ksat
        //hvilken port sender ?
        {
            set { ksat = value; }
        }

     
        private void DataRecieved(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            try
            {
                //get portnumber
                //the portnumber is used in 'getCollectedData()' to know to which grid to
                //send the data
                string portName = ((SerialPort)sender).PortName.ToString();
                //portNbr = Convert.ToInt32(portName.Substring(portName.Length - 1));
                string dataOut="";
               
                //add the last reading to data which i treated in 'getCollectedData() when timer t elabses
                data += port.ReadExisting();
                if(data.Contains("\r\n"))
                {
                    string[] dataArr = Regex.Split(data, "\r\n");
                    int i = dataArr.Length - 1;
                    bool found = false;
                    while(i > -1 && found ==false)
                    {
                        string tmp = dataArr[i];
                        int l =tmp.Length;
                        if (tmp.Length > 11)
                        {
                            found = true;
                           
                            dataOut = tmp.Replace("g", "").Replace("+", "").Replace("t" + (char)108 + "h", "").Replace("ct","").Trim();
                            data = "";
                            ksat.DataToGrid(dataOut);
                           
                        }
                        else
                        {
                            i--;
                        }
                     
                    }                           
                }                                         
            }

            catch
            {
            }
        }
        private string Reverse(string str)
        {
            char[] arr = str.ToCharArray();
            Array.Reverse(arr);
            return new string(arr);
        }

        public void SendCommand()
       
        {
            Console.Beep();
            string command = ((char)0x1b).ToString() + ((char)0x50).ToString() + ((char)0x0d).ToString() + ((char)0x0a).ToString();

            //send command         
            port.Write(command);                   

        }

        private bool IsNumeric(string data)
        {
            bool result = true;
            try
            {
                Convert.ToDouble(data);
            }
            catch
            {
                result = false;
            }
            return result;

        }   

       
    }
}
---------------------------------------------------------------------------------------------------------------------------------------------

Og er ksatClass som er tænkt som controller:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;

namespace Ksat
{
    class KsatClass
    {
       
       
        private ZedGraphControl zgc;
        private DataGridView dgv;
        private Sartorius serclass;
        private Timer timer;
        private DateTime startTime;
        private DateTime lastTime;
        private int objectNbr;
        FormMain f;

        private ZedView zv;

        public KsatClass(int objectNbr,ZedGraphControl zgc, DataGridView dgv, Sartorius serclass,Timer timer,FormMain f)
        {

            this.objectNbr=objectNbr;
            this.zgc = zgc;
            this.dgv = dgv;
            this.serclass = serclass;
            this.timer = timer;
            this.f = f;
            zv = new ZedView(dgv, zgc);
            serclass.Ksat = this;//tell sartorius to who it belong
            this.timer.Tick += new System.EventHandler(this.timer_Tick);
        }

        public Timer Timer
        {
            get { return timer; }
        }

        public DateTime StartTime
        {
            set { startTime=value; }
            get { return startTime; }
        }

        public DateTime LastTime
        {
            set { lastTime = value; }
            get { return lastTime; }
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            serclass.SendCommand();                       
        }

     
        public void DataToGrid(string data)
        {

            DateTime now = DateTime.Now;
            string time = now.ToLongTimeString();
            double deltaSek = now.Subtract(LastTime).TotalSeconds;
            double minuts = Math.Round(now.Subtract(StartTime).TotalMinutes, 3); ;
            double weight = Convert.ToDouble(data);//vægten

            //try
            //{
            //    int r = dataTable.Rows.Count - 1;
            //    double lastWeight = Convert.ToDouble((dataTable.Rows[r])[2]);
            //    double flow = Math.Round((weight - lastWeight) / deltaSek, 2);
            //    zv.AddRow(time, minuts.ToString(), weight.ToString(), flow.ToString());
            //}
            //catch
            //{
            //    zv.AddRow(time, minuts.ToString(), weight.ToString(), "");
            //}
         
            //LastTime = DateTime.Now;
            zv.AddRow(DateTime.Now.ToLongTimeString(), "1", weight.ToString(),"2");
            f.Refresh();//fejler

         
                   
        }
     
     
       

    }
}

Endelig formen:
---------------------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;

namespace Ksat
{
    public partial class FormMain : Form
    {
        KsatClass[] Ksat;

        public FormMain()
        {
            InitializeComponent();
        }

        private void FormMain_Load(object sender, EventArgs e)
        {
            Sartorius Sar1 = new Sartorius("COM4", 7, Parity.Odd, 1200, this);//opening comport
            Sartorius Sar2 = new Sartorius("COM5", 7, Parity.Odd, 1200, this);
            Sartorius Sar3 = new Sartorius("COM6", 7, Parity.Odd, 1200, this);
            Sartorius Sar4 = new Sartorius("COM7", 7, Parity.Odd, 1200, this);
            Sartorius Sar5 = new Sartorius("COM8", 7, Parity.Odd, 1200, this);
            KsatClass Ksat1 = new KsatClass(1, zg1, dataGridView1, Sar1, timer1,this);
            KsatClass Ksat2 = new KsatClass(2, zg2, dataGridView2, Sar2, timer2, this);
            KsatClass Ksat3 = new KsatClass(3, zg3, dataGridView3, Sar3, timer3, this);
            KsatClass Ksat4 = new KsatClass(4, zg4, dataGridView4, Sar4, timer4, this);
            KsatClass Ksat5 = new KsatClass(5, zg5, dataGridView5, Sar5, timer5, this);
            Ksat = new KsatClass[5] { Ksat1, Ksat2, Ksat3, Ksat4, Ksat5 };
            comboBox1.SelectedIndex = 1;
            comboBox2.SelectedIndex = 1;
            comboBox3.SelectedIndex = 1;
            comboBox4.SelectedIndex = 1;
            comboBox5.SelectedIndex = 1;
        }

        private void btm_start1_Click(object sender, EventArgs e)
        {
            Ksat[0].StartTime = DateTime.Now;
            Ksat[0].LastTime = DateTime.Now;
            Ksat[0].Timer.Start();
        }

        private void btm_start2_Click(object sender, EventArgs e)
        {
            Ksat[1].StartTime = DateTime.Now;
            Ksat[1].LastTime = DateTime.Now;
            Ksat[1].Timer.Start();
        }

        private void btm_start3_Click(object sender, EventArgs e)
        {
            Ksat[2].StartTime = DateTime.Now;
            Ksat[2].LastTime = DateTime.Now;
            Ksat[2].Timer.Start();
        }

        private void btm_start4_Click(object sender, EventArgs e)
        {
            Ksat[3].StartTime = DateTime.Now;
            Ksat[3].LastTime = DateTime.Now;
            Ksat[3].Timer.Start();
        }

        private void btm_start5_Click(object sender, EventArgs e)
        {
            Ksat[4].StartTime = DateTime.Now;
            Ksat[4].LastTime = DateTime.Now;
            Ksat[4].Timer.Start();
        }

        private void btm_Testdata_Click(object sender, EventArgs e)
        {
         
        }

        private void btm_stopt1_Click(object sender, EventArgs e)
        {
            Ksat[0].Timer.Stop();
        }

        private void btm_stopt2_Click(object sender, EventArgs e)
        {
            Ksat[1].Timer.Stop();
        }

        private void btm_stopt3_Click(object sender, EventArgs e)
        {
            Ksat[2].Timer.Stop();

        }

        private void btm_stopt4_Click(object sender, EventArgs e)
        {
            Ksat[3].Timer.Stop();
        }

        private void btm_stop5_Click(object sender, EventArgs e)
        {
            Ksat[4].Timer.Stop();
        }

        private void dataGridView2_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            this.Refresh();
            dataGridView2.Refresh();
           
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Ksat[0].Timer.Interval = Convert.ToInt32(comboBox1.SelectedItem.ToString()) * 1000;
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            Ksat[1].Timer.Interval = Convert.ToInt32(comboBox2.SelectedItem.ToString()) * 1000;
        }

        private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
        {
            Ksat[2].Timer.Interval = Convert.ToInt32(comboBox3.SelectedItem.ToString()) * 1000;
        }

        private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
        {
            Ksat[3].Timer.Interval = Convert.ToInt32(comboBox4.SelectedItem.ToString()) * 1000;
        }

        private void comboBox5_SelectedIndexChanged(object sender, EventArgs e)
        {
            Ksat[4].Timer.Interval = Convert.ToInt32(comboBox5.SelectedItem.ToString()) * 1000;

        }

        private void dataGridView2_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            this.Refresh();
            dataGridView2.Refresh();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Refresh();
        }
    }
}

Jeg har forsøgt at refresh'et formen forskellige steder med der kommer kun fejl ud af det.
Det eneste der virker er min knap.
Jeg bliver nødt til at forlade computeren en 2-  3 timer og har første mulighed for at teste i morgen når jeg kommer på arbejde til vægtene.
MEN JEG VIL GIVE MIN HØJRE ARM (næsten) FOR AT SVAR 
Avatar billede koppelgaard Praktikant
14. oktober 2009 - 18:21 #7
Jeg har forresten testet zedviewklassen.
Den virker fint, når data IKKE kommer fra serielporten med blot generes i en form. Så kører de to events fint og datagridwiew og zedgraph opdateres.

Michael
Avatar billede koppelgaard Praktikant
14. oktober 2009 - 18:45 #8
Vil gerne forhøje til 200 point, men har glemt som sædvanlig glemt hvordan.
Avatar billede kza Nybegynder
15. oktober 2009 - 00:32 #9
Hvad er det for en exception, du får på DataGridView.Refresh()?

Det kan skyldes noget multithread-halløj.

Det er kun den tråd (din hoved-tråd), der har oprettet DataGridView'ene, der må røre ved dem. Og jeg vil tro at Sartorius.DataReceived(...) kaldes på en baggrundstråd.
Du kan undersøge det ved at sætte et breakpoint i DataReceived(...) og dernæst åbne Threads vinduet i Visual Studio (menu Debug|Windows|Threads).

I så fald skal du et sted skifte fra din baggrundstråd til din hoved-tråd, og det kunne du fx. gøre i starten af KsatClass.DataToGrid(...):

    if (dgv.InvokeRequired)
        dgv.Invoke(new DataToGridDelegate(DataToGrid), new [] { data });

Du skal så også tilføje denne delegate erklæring til KsatClass klassen:

private delegate void DataToGridDelegate(string data);

/Klaus
Avatar billede koppelgaard Praktikant
15. oktober 2009 - 06:14 #10
1000 tak!!! Det skal prøves, så snart jeg kommer på arbejde.
Havde nok på fornemmelsen, at det var noget med det.
Lige meget, hvordan jeg prøvede fik jeg fejl på refresh.

Hvis der er andre ting ved min kode som er uhensigtsmæssigt eller uprofessionelt så sig bare til - jeg vil gerne lære.
Vender tilbage efter test...
Avatar billede koppelgaard Praktikant
15. oktober 2009 - 09:20 #11
Du havdere ret kza.
Sartorius.DataReceived(...)  var en workertråd.
Når følger din anvisning opdateres grid og graf - nogen gange dog med en del forsinkelse. Der må være en hel masse igang, hvad mon der optager systemet??

Jeg er tror godt, jeg vil have et ekstra argument med i DataToGrid.
Jeg vil gerne have tiden med, så den tid jeg knytter til vægten ikke afhænger af, hvornår der er tid til at opdatere.
Hvordan gør jeg det?
Har prøvet med:
private delegate void DataToGridDelegate(string data, dateTime time);
og
  if (dgv.InvokeRequired)
        dgv.Invoke(new DataToGridDelegate(DataToGrid), new [] { data, time });
men det virker ikke.

Sender du et svar kza?
OG TIL DIG BLVI JEG OPRETTER LIGE ET EKSTRA SPØRGSMÅL, SÅ DU OGSÅ HAR MULIGHED FOR AT FÅ POINT FOR DIN HJÆLP.

Michael
Avatar billede kza Nybegynder
15. oktober 2009 - 11:48 #12
Her er et svar.

Din ekstra parameter ser i øvrigt rigtig ud, på nær en stavefejl. 'DateTime' i steden for 'dateTime' i delegate'n.
Avatar billede koppelgaard Praktikant
15. oktober 2009 - 13:49 #13
hmmm så må jeg prøve igen.
Ser koden eller fornuftig ud?
Avatar billede kza Nybegynder
15. oktober 2009 - 23:43 #14
Uprofessionel kode? Hmmm... Jeg har set "professionel kode", af utrolig svingende kvalitet.

Jeg har kigget det igennem og set, om jeg synes, noget kan gøres bedre (der er altid noget).


Fejlhåndtering:
Du skal pakke koden i ZedView.AddRow ind i en try-catch blok.
Og så skal du gøre noget i dine catch blokke.
Fx:
    catch(Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.ToString());
        EventLog.WriteEntry(Application.ProductName, ex.ToString(), EventLogEntryType.Error);
    }
skriv til en fil, send en mail eller et eller andet.
Hvis du i dit oprindelig spørgsmål havde skrevet, hvilken exception du fik på Refresh(), så havde du fået svar meget hurtigere. Hvis du havde google't den, havde du måske selv fundet ud af det.


I ZedView ville jeg lytte på DataTable.RowChanged i steden for DataGridView.RowsAdded og DataGrid.RowsRemoved. I handleren til RowChanged kan du på e.Action se, om rækken er tilføjet eller fjernet.
Hvorfor blande DataGridView ind i at ZedGraphControl skal opdateres, når der tilføjes data til DataTable?


Hvis du tegner dine klasser som kasser på et stykke papir, og så tegner pile mellem dem, der kender til hinanden, så skal du have så få pile som muligt.

Du kunne lade FormMain oprette ZedView'et og give det til KsatClass - så behøver KsatClass ikke kende noget til DataGridView og ZedGraphControl (der forsvand to pile).

Der er pile i begge retninger mellem Satorius og KsatClass - det er ikke helt godt. I steden for at Satorius kalder en metode i KsatClass, kan du lade Satorius fyre en event, som KsatClass lytter på, så behøver Satorius ikke have en reference til KsatClass.

FormMain_Load
Jeg ville lave en metode, der tog nogle parametre ("COMx", zgX, dataGridViewX, timerX) og som så oprettede en Sartorius, en ZedView og en KsatClass, som den returnerede.
Den skulle så kaldes 4 gange i FormMain_Load.


Et par småting:

Lav FormMain.Ksat om til en List<KsatClass>.

Satorius.IsNumeric():
I steden for en try-catch, der er tidskrævende, skal du bruge:
    double value;
    return double.TryParse(data, out value);


Og RYD OP
Fjern udkommenteret kode og kommentarer, der ikke længere passer.
Fjern metoder, properties og member-variable, der ikke skal bruges mere (fx. FormMain f).
Avatar billede koppelgaard Praktikant
16. oktober 2009 - 07:52 #15
Tak Kza!
Jeg er mere en taknemmelig for dine råd.
Jeg synes min kode køre noget sløvt. Opdatering af datagridview sker langsomt.
Måske vil det lette at følge dine råd.
Og det vil jeg sandsynligvis følge dem alle.

Skal have tykket dem stille og roligt igennem her i weekenden
Så kommer der måske et par opklarende spørgsmål.
Jeg har brugt mine 200 på dette spørgsmål men vil gerne belønne din indsats.
Er det mon lovlig at oprette et nyt spørgsmål som du så kan besvare?

Michael
Avatar billede kza Nybegynder
16. oktober 2009 - 11:33 #16
Jeg har ikke været særlig meget herinde, så jeg ved ikke helt hvordan det foregår.

Husk i øvrigt selv at tage stilling til mine råd. Kasser dem, du synes er dårlige eller spild af tid, og følg de andre.

Ingen af mine råd vil i øvrigt hjælpe dig med performance, med mindre du er begyndt at kalde IsNumeric() med try-catch blokken rigtig mange gange.

Et råd mht. performance optimering: Lav målinger! Lad være med at gætte på, hvor tiden går - mål, hvor den forsvinder. Hvis du gætter, gætter du forkert - det siger alle erfaringer.

Det kan du gøre med en Profiler fra fx. JetBrains eller redgate. Jeg har selv gode erfaringer med den fra YourKit. De har alle en gratis trial periode.

Men det tager lidt tid at sætte sig ind i dem. Så en hurtigere løsning er at tilføje

System.Diagnostics.Debug.WriteLine("Fx. Satorius.DataReceived start " + DateTime.Now.ToString("HH:mm:ss.ffff"));

forskellige steder i koden, og så kigge i Output vinduet i VS mens programmet kører.
Da dit program er multitrået, kan outputtet godt være temmelig forvirrende, så til at starte med bør du nok kun køre mod en COM port.
Avatar billede koppelgaard Praktikant
16. oktober 2009 - 11:40 #17
Øv ingen performance forbedring!

Men i morgen vil jeg nu gennemgå dine råd grundigt.
Værd sød og se efter, om jeg har nogen spørgsmål - der kommer sikkert et par,
Jeg opretter et ekstra spørgsmål "strømlining af kode" med 200 point.

I morgen ....
Avatar billede koppelgaard Praktikant
17. oktober 2009 - 09:05 #18
Hej Kza
Jeg har stillet et par opklarede spørgsmål under:
http://www.eksperten.dk/spm/889750
Michael
Avatar billede koppelgaard Praktikant
27. oktober 2009 - 13:52 #19
Hej Kza
Jeg kan ikke få følgende råd til at virke fuldstændigt:
'I ZedView ville jeg lytte på DataTable.RowChanged i steden for DataGridView.RowsAdded og DataGrid.RowsRemoved. I handleren til RowChanged kan du på e.Action se, om rækken er tilføjet eller fjernet.
Hvorfor blande DataGridView ind i at ZedGraphControl skal opdateres, når der tilføjes data til DataTable?'

Eventen  DataTable.RowChanged, kører når jeg tilføjer rækker til datatablet med IKKE når jeg sletter rækker fra datagridviewet.
Men det er vel egentlig også klart ??

Det må betydet at sletning i datagiridviewet, ikke forplanter sig til datatablet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester