visual-studio - winforms,创建带有按钮的动态表格布局面板所需的帮助
问题描述
我正在尝试创建一个动态表格布局,它创建添加技能并赋予该技能 1 级和增加减少按钮。我正在努力让按钮访问级别标签。我想过找到被点击的按钮的位置,但可以弄清楚如何做到这一点。
提前,谢谢。
例子:
这是我到目前为止所拥有的:
private void skilladded(object sender, EventArgs e)
{
int i = 1;
int[] position= { 0,0};
bool test = false;
//string select;
int k=0;
for (i=1;i<=skillstableLayoutPanel.RowCount;i++)
{
Control c= skillstableLayoutPanel.GetControlFromPosition(0,i);
if (c!=null&&addskillswin.selected==c.Text)
{
test = true;
k = i;
break;
}
else if(c==null)
{
k = i;
break;
}
}
if (test==false)
{
Label newskill = new Label();
Label newskilllvl = new Label();
TableLayoutPanel buttontable = new TableLayoutPanel();
Button up = new Button();
Button down = new Button();
buttontable.ColumnCount = 2;
buttontable.RowCount = 1;
buttontable.RowStyles.Add(new RowStyle(SizeType.Percent,100f));
buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent,50f));
buttontable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50f));
buttontable.Margin = new Padding(0,0,0,0);
buttontable.Dock = DockStyle.Fill;
buttontable.Controls.Add(up, 0, 0);
buttontable.Controls.Add(down, 1, 0);
up.BackgroundImage = Properties.Resources.up;[enter image description here][2]
down.BackgroundImage = Properties.Resources.down;
up.BackgroundImageLayout=ImageLayout.Stretch;
down.BackgroundImageLayout = ImageLayout.Stretch;
newskill.Text = addskillswin.selected;
newskilllvl.Text = "1";
up.Margin = new Padding(0, 0, 0, 0);
down.Margin = new Padding(0, 0, 0, 0);
skillstableLayoutPanel.Controls.Add(newskill,0,k);
skillstableLayoutPanel.Controls.Add(newskilllvl, 1, k);
skillstableLayoutPanel.Controls.Add(buttontable, 2, k);
skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) - 1).ToString();
skillpointlvl = Convert.ToInt32(newskilllvl.Text);
up.MouseClick += new MouseEventHandler(skillup);
down.MouseClick += new MouseEventHandler(skilldown);
}
if (test==true)
{
skillstableLayoutPanel.GetControlFromPosition(1, k).Text = (Convert.ToInt32(skillstableLayoutPanel.GetControlFromPosition(1, k).Text) + 1).ToString();
skillavaillabel.Text = (Convert.ToInt32(skillavaillabel.Text) -1).ToString();
}
}
private void skillup(object sender, EventArgs e)
{
skillpointlvl++;
}
private void skilldown(object sender, EventArgs e)
{
skillpointlvl--;
}
解决方案
而不是这个:
up.MouseClick += new MouseEventHandler(skillup);
down.MouseClick += new MouseEventHandler(skilldown);
尝试这样的事情:
up.MouseClick += ((o, me) =>
{
int currentLevel = Int32.Parse(newskilllvl.Text);
currentLevel++;
newskilllvl.Text = currentLevel.ToString();
});
down.MouseClick += ((o, me) =>
{
int currentLevel = Int32.Parse(newskilllvl.Text);
currentLevel--;
newskilllvl.Text = currentLevel.ToString();
});
您的skillup
或skilldown
事件处理程序可能会处理每个发送者并查看单击源自哪个按钮,但您必须为每个按钮唯一命名并进行大量字符串比较以查看哪个按钮对应于哪个技能级别标签。上面的代码为每个按钮添加了一个匿名处理程序,这使我们基本上可以将被单击的按钮与其对应的技能标签联系起来。
不过,就个人而言,我不会像您所做的那样将所有这些值存储在标签中。我要么将它们存储在表单上的属性中,要么更好地存储在它们自己的类中。我还会将所有这些逻辑放在表单旁边的其他位置,例如在 Presenter 或 Controller(或类库)中,并遵循 MVC 或 MVP 等设计模式。从长远来看,这将使维护和更改应用程序更容易。
此外,请考虑对变量名使用骆驼大小写和帕斯卡大小写。对于有经验的程序员来说,所有小写变量都更难阅读。
推荐阅读
- reactjs - 使用 TypeScript、功能组件和钩子在 React 上下文提供程序中设置状态
- google-sheets - ARRAYFORMULA、偏移量和循环误差
- python - Getting the same result as the print
- c# - 在每个发布天蓝色的asp.net核心中重新启动托管服务(后台服务)
- reactjs - Reactjs - getDerivedStateFromProps() 未使用 setState 更新数据或编辑数据
- javascript - 如何访问在 django 中使用 url 发送的标头和数据?
- api - 在网站方面,前端和后端之间到底有什么区别?
- ios - UIPasteboard.general.string 耗时太长
- c++ - C++ 分配的文件处理部分的问题
- redis - Redis Cluster 读取操作的默认行为