100分求助,如图所示

TONG_先生 2018-07-17 11:14:41

winform里面,如何实现如图功能,题量可以获得,根据传过来的题量,自动加载多少个圆圈,答了一道题,还得去改变其颜色,这个到还好,小圆圈图片,美工已提供。


求大神帮忙。
...全文
224 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这个东西做起来说起来也简单也不简单,首先你要确认你的这个界面是按照数据驱动界面还是按照界面驱动数据,然后构建控件,最后写出自动添加语句即可。

先说到底是数据驱动还是界面驱动,这个说的很多做起来也不麻烦。
数据驱动界面的话,你的后台或其他位置一定有一个List<问答对象>的集合,你每次操作后先操作这个集合,再根据这个集合变更界面显示(这里有一个通用的优化查找界面对象的解决方案就是把你的界面对象增加到你的问答对象中去,这样你就不用每次都去查找界面对象了)。
界面驱动数据的话,你就需要做一个自定义的控件,这个控件内绑定你的问答对象(窗体应用你可以直接使用系统控件,有个tag你放什么都可以)每次控件的操作事件中绑定你问答对象的变更。

你确认好这个之后,就是控件本身了,这个控件是一个简单的变色圆形,实现方案有很多,最快捷而且后期维护性高的方案就是一个Lable(支持透明播放gif)扔一个背景图片即可。
然后是不管你用哪种驱动模式,都要有一个问答对象,这个对象在你的业务描述中看起来很简单,就是一个由 {id、问题、答案列表、用户选择的答案} 组成的对象,这些数据你怎么填充都是你这个问答对象的创建逻辑。

这些工作都做完,就是自动布局和自动添加了,这个部分楼上答案很丰富,我就不做任何补充了。
BUCTCLUB 2018-07-18
  • 打赏
  • 举报
回复
循环添加控件及控件事件 ,控制好控件的位置就可以了
正怒月神 2018-07-17
  • 打赏
  • 举报
回复
至于控件添加事件,那么你就循环里增加
btn.Click+=方法
正怒月神 2018-07-17
  • 打赏
  • 举报
回复
这不是典型的动态生成控件吗。。。。
并没有什么难度啊。。。

for(int i=0;i<5;i++)
{
Button btn =new Button();
btn.Top=10;
btn.Left=10*i;
btn.Name=i+"按钮"
btn.tag="存储一个属性"

this.panel.controls.add(btn);

}

手打的,大概就是这么生成控件,然后添加到前台的容器里就好了。
bsdekj2 2018-07-17
  • 打赏
  • 举报
回复
简单实现就是动态加载一大堆pictruebox。然后流布局。到时候改变对应的image就行了。
复杂的点的就是控件重绘。
E次奥 2018-07-17
  • 打赏
  • 举报
回复
这种问题都是第一眼看起来很复杂,实际上写起来很简单的; 循环添加控件啊,然后控制一行的个数;每个控件弄个按钮事件,修改颜色;
just59277 2018-07-17
  • 打赏
  • 举报
回复
直接添加button 将button的background image 换成你的,记得去掉button的边框以及text内容,另外可以使用flowlayoutPanel作为容器,就不需要根据自己去定义按钮的位置了。
其他的就跟版主说的一样了。
wolf004 2018-07-17
  • 打赏
  • 举报
回复
for (var i = 0; i < 9; i++)
{
for (var j = 0; j < 9; j++)
{
TextBox txt = new TextBox();
txt.Name = "txt_" + i.ToString() + j.ToString();
txt.Multiline = true;
txt.Width = 50;
txt.Height = 50;
txt.Location = new System.Drawing.Point(i * 50 + 230, j * 50 + 140);


if (!gg99[i][j].ToString().Equals("0"))
{
txt.Text = gg99[i][j].ToString();
txt.TextAlign = HorizontalAlignment.Center;
txt.ReadOnly = true;
txt.Font = new System.Drawing.Font("宋体", 27.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
}
else
{
txt.ForeColor = Color.Red;
txt.Text = "";
txt.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
txt.TextChanged += new EventHandler(textBox_TextChanged);
}
this.Controls.Add(txt);
}
}

private void textBox_TextChanged(object sender, EventArgs e)
{
//对应的事件


简单改改就可以实现你要的功能了
十八道胡同 2018-07-17
  • 打赏
  • 举报
回复
  for (int i = 0; i < this.tlpDate.RowCount; i++) //行
{
for (int j = 0; j < this.tlpDate.ColumnCount; j++)
{
if (i == 0 && (j + 1) <= firstDayOfWeek && firstDayOfWeek != 7)
{
continue;
}
day++;
PanelControl p = new PanelControl();
p.Name = "p" + i.ToString() + j.ToString();
p.Dock = DockStyle.Fill;
SimpleButton btn = new SimpleButton();
btn.Name = "btn" + ((i - 1) * 7 + j + 1);
btn.Dock = DockStyle.Fill;
//然后下面设置btn的颜色


项目中的代码片段

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧