1. 程式人生 > 其它 >C# Linq查詢 取出指定的控制元件對應順序插入資料

C# Linq查詢 取出指定的控制元件對應順序插入資料

技術標籤:c#c#

在這裡插入圖片描述

所有textBox的命名為t1-t6
需要在tableLayOutPanel中取出所有的textBox控制元件,然後從plc中讀取連續的暫存器,一一對應插入textBox

private void button8_Click(object sender, EventArgs e)
  {
 	  //取出一組資料
      OperateResult<float[]> result1 = busTcpClient.ReadFloat("0", 6);
      if (result1 == null || !result1.IsSuccess)
return; foreach (var item in result1.Content) { //測試取出的資料是否正確 Console.WriteLine(item); } //for迴圈 按照順序取出textBox //textBox後面是123456序號,取出序號和for裡面的i + 1相等的,這是為了保證讀出的暫存器需要和控制元件序號對應 for (int i = 0; i < result1.Content.Length; i++) { //強制轉化為TextBox型別
//Linq查詢,利用GetControls1()方法取出tableLayoutPanel2下的所有控制元件 TextBox myControls = (TextBox)(from Control c in tableLayoutPanel2.GetControls1() where c is TextBox && c.Name.Substring(c.Name.Length - 1).Equals((i + 1).ToString()) select
c).FirstOrDefault(); if (myControls == null) continue; // 找某控制元件下的所有控制元件,返回的是Control型別,優先使用Control型別下面的屬性進行賦值, // 萬一有些控制元件比較特殊,就轉換成指定型別的控制元件的屬性(上面的強制轉換,此處不轉化也可以)進行操作 myControls.Text = result1.Content[i].ToString(); } }
public static class ControlHelper
 {
     /// <summary>
     /// 將容器的Controls屬性及其子控制元件下的所有控制元件的轉換成列舉型別以便使用LINQ語句進行查詢
     /// </summary>
     /// <param name="container"></param>
     /// <returns></returns>
     public static IEnumerable<Control> GetControls1(this Control container)
     {
         foreach (Control childControl in container.Controls)
         {
             // Recurse child controls.
             foreach (var grandChild in GetControls1(childControl))
                 yield return grandChild;
             yield return childControl;
         }
     }

 }

在這裡插入圖片描述 =>在這裡插入圖片描述

針對上面提到的找不到控制元件的對應屬性:

XButton為自定義控制元件,繼承了Button類,添加了EnName, Address屬性

class XButton : Button
{
    private string enName;
    private string address;
    public string EnName {
        get { return enName; }
        set { enName = value; }
    }
    public string Address {
        get { return address; }
        set { address = value; }
    }
}

在Form1中新增10個XButton控制元件,和1個Lable控制元件
在這裡插入圖片描述

foreach (Control myButton in this.GetControls1())
{
	//在判斷的時候就直接轉換了控制元件的型別,並且聲明瞭變數名稱
    if (!(myButton is XButton button))
        continue;
    //Console.WriteLine(myButton.Name);
    //可以訪問Xbutton下新新增的兩個屬性
    button.EnName = "";
    button.Address = "";
}