C# 禁用动态按钮
嗨,我有一个小的winforms程序,很快就会发展成更多的东西。该程序有两个面板C# 禁用动态按钮,c#,arrays,winforms,C#,Arrays,Winforms,嗨,我有一个小的winforms程序,很快就会发展成更多的东西。该程序有两个面板panel1和panel2这些面板使用一些表单控件动态填充。第一个面板填充有组合框,第二个面板填充有按钮网格。我想要实现的是能够根据用户从组合框中选择的内容禁用右按钮。网格中的每一列表示一周中的一天,组合框将用于通过从列表中选择所需日期来禁用所需日期 静态地做这件事很简单,但是我的程序很快就会扩展,这样它就可以处理一个大型数据库,这就是为什么我要动态地做这件事。基本上,这就是我被卡住的地方,我只想简单地禁用右边的按钮
panel1
和panel2
这些面板使用一些表单控件动态填充。第一个面板填充有组合框,第二个面板填充有按钮网格。我想要实现的是能够根据用户从组合框中选择的内容禁用右按钮。网格中的每一列表示一周中的一天,组合框
将用于通过从列表中选择所需日期来禁用所需日期
静态地做这件事很简单,但是我的程序很快就会扩展,这样它就可以处理一个大型数据库,这就是为什么我要动态地做这件事。基本上,这就是我被卡住的地方,我只想简单地禁用右边的按钮
以下是我目前拥有的界面:
这是我的代码,如果有任何帮助:
public Form1()
{
InitializeComponent();
}
Button[] btn = new Button[2];
ComboBox[] cmb = new ComboBox[1];
private void Form1_Load(object sender, EventArgs e)
{
placeRows();
}
public void createColumns(int s)
{
for (int i = 0; i < btn.Length; ++i)
{
btn[i] = new Button();
btn[i].SetBounds(40 * i, s, 35, 35);
btn[i].Text = Convert.ToString(i);
panel1.Controls.Add(btn[i]);
}
for (int i = 0; i < cmb.Length; ++i)
{
cmb[i] = new ComboBox();
cmb[i].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);
cmb[i].Text = "Disable";
cmb[i].Items.Add("Monday");
cmb[i].Items.Add("Tuesday");
cmb[i].SetBounds(40 * i, s, 70, 70);
panel2.Controls.Add(cmb[i]);
}
}
void cmb_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox senderCmb = (ComboBox)sender;
if (senderCmb.SelectedIndex == 1)
{
//MessageBox.Show("Tuesday");
btn[1].Enabled = false;
}
}
public void placeRows()
{
for (int i = 0; i < 80; i = i + 40)
{
createColumns(i);
}
}
}
public Form1()
{
初始化组件();
}
按钮[]btn=新按钮[2];
组合框[]cmb=新组合框[1];
私有void Form1\u加载(对象发送方、事件参数e)
{
placeRows();
}
公共void createColumns(int s)
{
对于(int i=0;i
备选方案1
每个控件都有一个标记
属性
您可以设置按钮的标记
属性,以表示它们所在的列
在组合框中进行选择时,只需搜索所有按钮,并根据每个按钮的标记
属性是否与组合框中选定的文本匹配来启用或禁用按钮
备选方案2
创建一个
Dictionary<string, List<Button>> buttonMap;
字典按钮映射;
其中键是表示列(“星期二”)的值,该值是带有该标记的按钮列表。最初创建按钮时,也要填充该字典
如果使用备选方案2,则必须记住以前选中的复选框值,以便重新启用不再禁用的按钮
如果你有很多按钮,你可能会发现备选方案2明显更快
更新
这是备选方案1的完整工作示例
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const int ROWS = 2;
const int COLS = 2;
Button[,] btn = new Button[ROWS,COLS];
ComboBox[] cmb = new ComboBox[ROWS];
private void Form1_Load(object sender, EventArgs e)
{
placeRows();
}
private readonly string[] cbTexts = new string[] { "Monday", "Tuesday" };
public void createColumns(int rowIndex)
{
int s = rowIndex * 40;
// Your original code kept overwriting btn[i] for each column. You need a 2-D array
// indexed by the row and column
for (int colIndex = 0; colIndex < COLS; colIndex++)
{
btn[rowIndex, colIndex] = new Button();
btn[rowIndex, colIndex].SetBounds(40 * colIndex, s, 35, 35);
btn[rowIndex, colIndex].Text = Convert.ToString(colIndex);
btn[rowIndex, colIndex].Tag = cbTexts[colIndex];
panel1.Controls.Add(btn[rowIndex, colIndex]);
}
cmb[rowIndex] = new ComboBox();
cmb[rowIndex].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);
cmb[rowIndex].Text = "Disable";
foreach (string cbText in cbTexts)
{
cmb[rowIndex].Items.Add(cbText);
}
cmb[rowIndex].SetBounds(40, s, 70, 70);
cmb[rowIndex].Tag = rowIndex; // Store the row index so we know which buttons to affect
panel2.Controls.Add(cmb[rowIndex]);
}
void cmb_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox senderCmb = (ComboBox)sender;
int row = (int)senderCmb.Tag;
for (int col = 0; col < COLS; col++)
{
Button b = btn[row, col];
// These three lines can be combined to one. I broke it out
// just to highlight what is happening.
string text = ((string)b.Tag);
bool match = text == senderCmb.SelectedItem.ToString();
b.Enabled = match;
}
}
public void placeRows()
{
for (int rowIndex = 0; rowIndex < 2; rowIndex++)
{
createColumns(rowIndex);
}
}
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
const int ROWS=2;
常数int COLS=2;
按钮[,]btn=新按钮[行,列];
组合框[]cmb=新组合框[行];
私有void Form1\u加载(对象发送方、事件参数e)
{
placeRows();
}
私有只读字符串[]cbTexts=新字符串[]{“星期一”、“星期二”};
public void createColumns(int rowIndex)
{
int s=行索引*40;
//您的原始代码不断覆盖每列的btn[i]。您需要一个二维数组
//按行和列索引
对于(int colIndex=0;colIndex
备选方案1
每个控件都有一个标记
属性
您可以设置按钮的标记
属性,以表示它们所在的列
在组合框中进行选择时,只需搜索所有按钮,然后启用或禁用