标题:新手求助个关于WindForm窗口设计的问题
只看楼主
家乐福海盗
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2010-8-29
结帖率:100%
已结贴  问题点数:20 回复次数:9 
新手求助个关于WindForm窗口设计的问题
请看2个附图。

求助的问题:
当选择左侧不同的图形时,右侧显示相应的界面。请问这样的效果该怎么设计,操作起来更方便?

新人求助,问题简单,但还请各位赐教!
能有实例的,更是感激!







[ 本帖最后由 家乐福海盗 于 2012-12-18 11:15 编辑 ]
搜索更多相关主题的帖子: 设计 
2012-12-18 11:13
家乐福海盗
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2010-8-29
得分:0 
我能想到并且尝试的方法,就是右侧用不同的panel控件,设置隐藏,调用的时候,显示。

但这样操作起来会很麻烦。
2012-12-18 11:20
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:8 
最不动脑子的思路
考虑下lable.text重新赋值
和lable,textbox的enable属性的重新赋值
顺便鄙视一下
这个treeview和这样的计算界面,还真是奇丑无比呀

厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-18 11:23
家乐福海盗
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2010-8-29
得分:0 
回复 3楼 mpi
多谢赐教!

界面设计丑陋就暂时丑陋吧,能说明问题也就可以了

关于您的思路,我想多求教些:
1、当TreeView里选项很多的时候,代码会不会巨多呢?
2、当右侧控件很多的时候,尤其是右侧布局不相似的时候,该怎么办?
2012-12-18 11:43
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:0 
以下是引用家乐福海盗在2012-12-18 11:43:11的发言:

多谢赐教!

界面设计丑陋就暂时丑陋吧,能说明问题也就可以了

关于您的思路,我想多求教些:
1、当TreeView里选项很多的时候,代码会不会巨多呢?
2、当右侧控件很多的时候,尤其是右侧布局不相似的时候,该怎么办?
1、看你算法的优化了呀,你可以考虑把前面的各种形状作为参数,体积和面积也为参数,只要调用一个方法就可以解决所有的问题,但是代码是省不了的,因为计算各种形状的算法是不一样的。
2、不相似的太多的话,你可以尝试把右边用选项卡控件,再跟据左边选择自动切换功能页呢(不过依然很丑)

厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-18 13:18
c编程新手
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-17
得分:0 
不错不错
2012-12-18 18:11
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:12 
其实也并不麻烦,关键是要有使对象“关联”起来的思想,建议你牢记这个思想,其它的你记不记得住无所谓,能记住这个的话,对你的用处比你搞出这个程序要大得多,可以终生受益。
那么我们怎么将TreeView里面的Node和不同的参数界面联系起来呢,我用的是Tag属性,将Node的Tag的值与相应参数控件的容器Panel的Tag对应起来,这样在TreeView控件发出AfterSelect事件的时候,我们能得到发出事件的Node的Tag的值,从而能够使Tag值与此相同的容器Panel显示出来,而其它的Panel隐藏起来。
设计界面如下,里面的参数Panel的Visible初始都设置为false:


设置Node的Tag值:


设置相应的参数控件容器Panel的Tag的值:


Button和结果TextBox是公用的,然后代码:
程序代码:
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication9
{
    public partial class FormMain : Form
    {
        #region 构造函数

        public FormMain()
        {
            InitializeComponent();
            Tv.AfterSelect += Tv_AfterSelect;
        }

        #endregion

        #region 控件事件

        void Tv_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Tag == null) return;
            foreach (var panel in PanelContainer.Controls.Cast<Panel>())
            {
                if (panel.Tag == null) continue;
                var targetId = e.Node.Tag.ToString();

                if (panel.Visible)
                    panel.Visible = false;
                else
                {
                    if (panel.Tag.ToString() != targetId) continue;
                    panel.Dock = DockStyle.Fill;
                    panel.Visible = true;
                }
            }
        }

        #endregion
    }
}


处理动态的东西时,一定要想办法使他们之间关联起来,避免硬编码,从而使程序拥有一定的灵活性和可扩展性,这个思想你以后在数据库的设计等方面都要用到的。

[ 本帖最后由 mmxo 于 2012-12-18 20:07 编辑 ]

为提高中华编程水平而奋斗
2012-12-18 20:03
家乐福海盗
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2010-8-29
得分:0 
回复 7楼 mmxo
多谢您详细的回复。
2012-12-19 11:23
mpi
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:99
专家分:872
注 册:2012-11-14
得分:0 
以下是引用家乐福海盗在2012-12-19 11:23:39的发言:

多谢您详细的回复。
板板没帮你解决TV里有更多多边型的,右边panel摆放和显示位置。
计算公式的代码也是一行也少不了的,要你自己写。
用var 变量的方法,不是C#吧
不过最重要的是学习了关联思想 ,过程也是乐趣

厌烦自私贪婪和不劳而获的人。
厌烦代码各种求,而不思进取的人。
本人也是菜鸟,求上进,踏实不浮躁的朋友共同进步。
2012-12-19 13:43
家乐福海盗
Rank: 2
等 级:论坛游民
帖 子:10
专家分:12
注 册:2010-8-29
得分:0 
回复 9楼 mpi
如您所说,var关键词我确实不明白是什么意思,但我大概知道代码的大意,只是判断下哪个TreeView被选中,然后显示相应控件组。应该就是版版说的tag关联思想吧。

也许您不知道,我是由此联想到同时也测试过了。在设计界面的时候,把这个界面设计N宽度,然后在TV右侧,做并排的几个panel,并且,把btn和textBox也分别放到各个panel里。在程序启动的时候,重新设置界面尺寸。这样界面就更加紧凑、合理。
同时,在TV节点别选中,相应的panel重新定位到紧挨TV右侧。如此一来,btn点击事件也不用再判断是哪个图形被选中了。

说实话,对于我这样一个快40的人,不懂英语,利用业余时间自学不到2个月的人来说,能想到这么多,也多少有些自喜的。也许还存在某些弊端,但对于一个练习程序,能实现功能,无明显错误,也就可以了。而且,我一直认为基础重要,思路更重要。基础知识可以查,思路恐怕查起来难上加难了,您说呢?
2012-12-20 16:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-391793-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.331213 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved