iT邦幫忙

0

[C#] 透過網路從Arduino 擷取文字訊息並顯示在datagridview 上, 但不知道如何覆蓋一樣編號的內容. 目前卡在會持續新增新的筆數

JC 2021-11-07 15:16:531203 瀏覽
  • 分享至 

  • twitterImage
  1. arduino 透過網路傳輸輸出跟下面一樣文字內容
  2. 顯示在datagridview上, 但目前會卡到相同編號的內容會直接被新增. 如下

請問要如何可以把新增的內容直接覆蓋在相同編號上? 謝謝
程式碼如下:

private void showUI(ArrayList uiRawData)
        {
           
            try             
            {
                if (RowsIndex >0)
                {                    
                    int rowId = this.dataGridView1.Rows.Add("");                    
                    for (int uiRawIndex = 0; uiRawIndex < uiRawData.Count; uiRawIndex++)
                    {
                        
                        this.dataGridView1.Rows[rowId].Cells[uiRawIndex].Value = uiRawData[uiRawIndex];
                    }
                }
                else
                {                    
                    for (int uiRawIndex = 0; uiRawIndex < uiRawData.Count; uiRawIndex++)
                    {
                        this.dataGridView1.Rows[RowsIndex].Cells[uiRawIndex].Value = uiRawData[uiRawIndex];
                    }
                }
                
            }
            catch (Exception ex)
            {
                var st = new StackTrace(ex, true); // Get stack trace for the exception with source file information
                var frame = st.GetFrame(0); // Get the top stack frame
                var line = frame.GetFileLineNumber(); // Get the line number from the stack frame
                this.Save_DeBugLog("line: " + line + "Trace: " + st);
                MessageBox.Show(st + "line: " + line, "MError");
            }
        }
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-11-07 16:58:58
最佳解答

你這部份showUI(ArrayList uiRawData)只是「顯示」 data 的部份
修改此部份沒有辦法解決你的問題
你要看的
應該是「產生」(ArrayList uiRawData)那部份的程式碼

貼程式碼而不是貼圖片
先給你按個/images/emoticon/emoticon12.gif

看更多先前的回應...收起先前的回應...
JC iT邦新手 2 級 ‧ 2021-11-07 23:24:17 檢舉

(以下補充說明, 如果資訊不夠充足, 會繼續補充.因為真的不知道該怎麼解.. 非常感謝)

會從網路端擷取資料回來後先存到strArray , 再將裏頭的資料轉換跟寫到Arraylist 裏頭去

以下這個資料是從Arduino 那邊透過網路模組送出的, 是會連續發送. 但我是提取開頭為Result: 結尾是0的資料以**;**分割的方式將數值依序放入ArrayList 不同的位置中
簡單的說每一筆資料長這樣

Result: ;6;Initial;175;248;13440;0.5298;0.6798;25.88;1;0;100%;0

下面這個是連續送資料的樣子

Result: ;6;Initial;175;248;13440;0.5298;0.6798;25.88;1;0;100%;0
Result: ;13;Initial;175;244;13440;0.5347;0.6844;25.88;1;0;100%;0
Result: ;1;Ready;189;251;14760;0.5298;0.5842;25.88;1;0;100%;0
Result: ;6;Initial;175;248;13440;0.5298;0.6798;25.88;1;0;100%;0
Result: ;13;Initial;175;244;13440;0.5347;0.6844;25.88;1;0;100%;0
Result: ;1;Ready;189;251;14640;0.5298;0.5842;25.88;1;0;100%;0

定義

public ArrayList strRawArray = new();
public Int32 RowsIndex = 0;

下面這個是從網路端擷取的程式碼
閱讀困難的話請參考Gist連結

 while (true)
                {                       
                    if (this.SckSs[Scki].Receive(buffer, SocketFlags.Peek) != 0)
                    {
                        IntAcceptData = this.SckSs[Scki].Receive(clientData);
                        string[] strArray = Encoding.ASCII.GetString(clientData, 0, IntAcceptData).Split(';');                        
                        if ((strArray[0] == "Result: " && strArray[12] == "0") && (strArray.Length == 13 || strArray.Length == 15))
                        {
                            strRawArray.Clear();
                            strRawArray.Add(this.connectNum); // no
                            strRawArray.Add(clientip.Address); // ip addr
                            strRawArray.Add(Convert.ToInt32(strArray[1])); // fan num
                            strRawArray.Add(strArray[2]); // status
                            strRawArray.Add(Convert.ToInt32(strArray[3])); // gain                        
                            strRawArray.Add(Convert.ToInt32(strArray[4])); // triger
                            strRawArray.Add(Convert.ToDouble(strArray[5])); // rpm
                            strRawArray.Add(Convert.ToDouble(strArray[6])); // vol
                            strRawArray.Add(Convert.ToDouble(strArray[7])); // curr
                            strRawArray.Add(Convert.ToDouble(strArray[8])); // temp
                            strRawArray.Add("-");  // MUI
                            strRawArray.Add("-"); // stdRPM
                            strRawArray.Add(Convert.ToInt32(strArray[9])); // pwm
                            strRawArray.Add(Convert.ToInt32(strArray[10])); // source
                            strRawArray.Add(strArray[11]); // duty , strArray[21] , end      
                            strRawArray.Add(this.start_time);
                            strRawArray.Add(DateTime.Now);
                            if (strArray.Length > 13)
                            {
                                strRawArray.Add(Convert.ToDouble(strArray[13])); // BEMF-channel
                                strRawArray.Add(Convert.ToDouble(strArray[14])); // BEMF-value 
                            }
                            else
                            {
                                strRawArray.Add("-");
                                strRawArray.Add("-");
                            }
                            strRawArray.Add("-");
                            strRawArray.Add("-");                            
                            showUI(strRawArray);
                            RowsIndex++;
                        }
                    }
                    else
                        break;                    
                }
jack8900 iT邦新手 2 級 ‧ 2021-11-08 09:12:26 檢舉

產生LIST的部分要去判斷LIST裡面有沒有已經重複的序號,如果有的話就取代掉

我明白了

請回答以下問題:
「當程式停止後,這些從 Arduino 收到的資料,要不要保留?」
1.如果要,改寫如下
將收到的資料寫進資料庫
datagridview 原本讀 ArrayList 改成讀資料庫
2.如果不要,改寫如下
將原本一維的 ArrayList 改為二維的 ArrayList (uiRawData)
每讀到一筆資料
2.1 不要清空 uiRawData
2.2 要「判斷是否已存在 uiRawData」,有則覆蓋,無則新增
datagridview 每次清空,顯示「整個 uiRawData」

重點只有一句話:
把 datagridview 的資料來源改成「二維 ArrayList」或「資料庫」

JC iT邦新手 2 級 ‧ 2021-11-08 13:40:14 檢舉

從arduino 收到的資料在即時顯示在datagridview後不用保留
下一筆新的資料進來後 直接覆蓋到相同編號的即可.
uiRawData <- 這個會一直被刷新

請問二維ArrayList 一維是當下收到的資料, 另一維要放什麼? 之前的嗎? 謝謝

請參考這篇
1.資料部份
原本 strRawArray 就等同 uiRawData
改成
先判斷 strRawArray 在 uiRawData 裡有沒有重覆來決定是要新增或覆蓋
strRawArray 只有一筆,每次清空
uiRawData 是「累積」的(eg.多筆),不每次清空
2.顯示部份
原本 uiRawData 只有一筆,固定「新增一列」進 gridview
改成
先清空 gridview,再顯示「多筆」的 uiRawData

JC iT邦新手 2 級 ‧ 2021-11-08 20:59:24 檢舉

謝謝~ 因為不能選下面為最佳解. 只好選在上面

我要發表回答

立即登入回答