C# Linq查詢 取出指定的控制元件對應順序插入資料
阿新 • • 發佈:2020-12-21
所有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 = "";
}