有没有办法访问和更改以编程方式添加到面板的自定义控件中的值?
Is there a way to access and change a value in a custom control that was added, programmatically, to a panel?
如何在自定义控件中更改复选框 "checked" 的值,在以编程方式将其添加到 table 之后?
我有一个自定义控件,它有一个文本框和一个复选框。 (我没有足够的声誉 post 一张图片,但这是一张截图)
https://imgur.com/a/yyXG7p8
它有一个复选框和一个文本框。
有一个 public 方法,在那个 class 中,允许将复选框设置为真或假:
public void setCheckBox(bool set)
{
checkBox1.Checked = set;
}
在另一个 class 中,主要 class,我有一个循环将这些自定义控件添加到面板:
private void DrawInputBits()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 32; j++)
{
currentTag = tagsFile[tagIndex];
tagIndex++;
CustomControl.BitsControl newBits = new CustomControl.BitsControl(i, j, currentTag, false);
InputBitsTable.Controls.Add(newBits);
}
}
}
如果你看不出来,每个复选框保存4个数字的32位数字中一位的值(因此嵌套循环0-31,4次),重点是显示或控制价值。您可以忽略有关标签的代码。所做的只是从文件中读取文本并用读取的文本填充文本框。
当代码执行时,如果某个位的状态发生变化,复选框也应该改变状态。以下循环将被修改为遍历一个 int 数组(4 个整数)并在读取每个位的状态后更新每个复选框。目前,循环只是设置为将所有位更改为 "true"。这最终不是我想要的,但重点是,我什至无法引用面板中的自定义控件来更改复选框。我认为以下方法会起作用,但我还没有尝试过。
private void UpdateInputsScreen(int[] inputDINTS)
{
for(int i = 0; i < InputBitsTable.Controls.Count; i++)
{
for(int j = 0; j < 32; j++)
{
InputBitsTable.Controls[i].setCheckBox(true);//this line gives an error.
}
}
}
这是自定义控件的 class。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace CustomControl
{
public partial class BitsControl: UserControl
{
int bit = 0;
int dint = 0;
string tag = "";
BitsControl(int dint, int bit, string tag, bool isEnabled)
{
InitializeComponent();
this.dint = dint;
this.bit = bit;
this.tag = makeTag(tag, dint, bit);
this.textBox1.Text = this.tag;
checkBox1.Enabled = isEnabled;
}
private string makeTag(string tag, int dint, int bit)
{
string newTag = tag + ":[" + dint + "]." + bit;
return newTag;
}
public void setCheckBox(bool set)
{
checkBox1.Checked = set;
}
}
}
主要的 class 有点太长了,但我可以应要求提供。
将列表或字典保存到控件中怎么样:
var dict = new Dictionary<string, CustomControl.BitsControl>();
创建组件时将其添加到字典中:
dict.Add(currentTag, newBits);
然后尝试类似的操作:
foreach(var tag in tagsFile)
{
dict[tag].setCheckBox(true);
}
如何在自定义控件中更改复选框 "checked" 的值,在以编程方式将其添加到 table 之后?
我有一个自定义控件,它有一个文本框和一个复选框。 (我没有足够的声誉 post 一张图片,但这是一张截图) https://imgur.com/a/yyXG7p8
它有一个复选框和一个文本框。
有一个 public 方法,在那个 class 中,允许将复选框设置为真或假:
public void setCheckBox(bool set)
{
checkBox1.Checked = set;
}
在另一个 class 中,主要 class,我有一个循环将这些自定义控件添加到面板:
private void DrawInputBits()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 32; j++)
{
currentTag = tagsFile[tagIndex];
tagIndex++;
CustomControl.BitsControl newBits = new CustomControl.BitsControl(i, j, currentTag, false);
InputBitsTable.Controls.Add(newBits);
}
}
}
如果你看不出来,每个复选框保存4个数字的32位数字中一位的值(因此嵌套循环0-31,4次),重点是显示或控制价值。您可以忽略有关标签的代码。所做的只是从文件中读取文本并用读取的文本填充文本框。
当代码执行时,如果某个位的状态发生变化,复选框也应该改变状态。以下循环将被修改为遍历一个 int 数组(4 个整数)并在读取每个位的状态后更新每个复选框。目前,循环只是设置为将所有位更改为 "true"。这最终不是我想要的,但重点是,我什至无法引用面板中的自定义控件来更改复选框。我认为以下方法会起作用,但我还没有尝试过。
private void UpdateInputsScreen(int[] inputDINTS)
{
for(int i = 0; i < InputBitsTable.Controls.Count; i++)
{
for(int j = 0; j < 32; j++)
{
InputBitsTable.Controls[i].setCheckBox(true);//this line gives an error.
}
}
}
这是自定义控件的 class。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace CustomControl
{
public partial class BitsControl: UserControl
{
int bit = 0;
int dint = 0;
string tag = "";
BitsControl(int dint, int bit, string tag, bool isEnabled)
{
InitializeComponent();
this.dint = dint;
this.bit = bit;
this.tag = makeTag(tag, dint, bit);
this.textBox1.Text = this.tag;
checkBox1.Enabled = isEnabled;
}
private string makeTag(string tag, int dint, int bit)
{
string newTag = tag + ":[" + dint + "]." + bit;
return newTag;
}
public void setCheckBox(bool set)
{
checkBox1.Checked = set;
}
}
}
主要的 class 有点太长了,但我可以应要求提供。
将列表或字典保存到控件中怎么样:
var dict = new Dictionary<string, CustomControl.BitsControl>();
创建组件时将其添加到字典中:
dict.Add(currentTag, newBits);
然后尝试类似的操作:
foreach(var tag in tagsFile)
{
dict[tag].setCheckBox(true);
}