当前位置:编程学习 > C#/ASP.NET >>

昨天发帖没解决,今天再发一次。求一算法.


上图的方框是TextBox(60个TextBox,从第1层第01排开始:t1,t2,t3...一直到t12,第2行t13,t14...t24以此类推),点第1次为红色(值为1),点第2次为白色(值为0),第3次为红色(值为1),第4次为白色(值为0); 
问题描述: 
我这样每个TextBox都要去点1次很麻烦. 
比如1:我点t1,再去点t12,那么t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12全部为背景色为红色; 点t1,再点t5,t1,t2,t3,t4,t5背景色为红色;
比如2:点t1,再点t49(第5层的01排),那么t1,t13,t25,t37,t49全部为红色; 

高手们帮下小弟咯,搞定了的打开http://topic.csdn.net/u/20080623/14/3183c800-f5ea-4b94-9cc2-74f51c2de820.html 发表下,再给100分啊。。

--------------------编程问答-------------------- mark,下午有时间帮你搞搞 --------------------编程问答--------------------
引用 1 楼 ojlovecd 的回复:
mark,下午有时间帮你搞搞

谢谢,我脑瓜子弄不好算法东西。。唉 --------------------编程问答-------------------- 有没有可能说点T1和T15
这样第一行到第二行的T15都要红色的? --------------------编程问答-------------------- 首先明确2个问题:
(1),是不是必须先点小号的,再点大号的?
(2),是不是2次点击的必须要在同一行或同一列? --------------------编程问答-------------------- 这个应该不算很难,晚上要是有时间帮你写一下。
不知道你实现的效果是不是类似于在windows资源管理器窗口中,用Shift选中文件的感觉。 --------------------编程问答-------------------- int iMoto;

private void textbox_Click(object sender, EventArgs e)
if(iMoto==0)
{
    iMoto=GetIndex(sender);
    returnl
}
if(GetIndex(sender)-1)/12=c-1/12);
{
    把同行的变色    
}
if(GetIndex(sender)-1)%12=c-1%12);
{
    把同列的变色    
}

private int GetIndex(object obj)
{   //取"tXX"中的XX
    return Convert.ToInt32(((TextBox)obj).Name.SubString(1))
} --------------------编程问答--------------------
引用 3 楼 zzyhuian06142 的回复:
有没有可能说点T1和T15 
这样第一行到第二行的T15都要红色的?


另:
如果t1,t2,t3是红色,那么现在点了t1,,,,t15,是不是t1,t2,t3要变白色啊?

顶下先,现在没有时间,等会帮你写,感觉不难的啊。 --------------------编程问答--------------------
引用 3 楼 zzyhuian06142 的回复:
有没有可能说点T1和T15 
这样第一行到第二行的T15都要红色的?

T15是第2层的,不要红色。。 --------------------编程问答--------------------
引用 7 楼 RonoTian 的回复:
引用 3 楼 zzyhuian06142 的回复:
有没有可能说点T1和T15 
这样第一行到第二行的T15都要红色的? 
 

另: 
如果t1,t2,t3是红色,那么现在点了t1,,,,t15,是不是t1,t2,t3要变白色啊? 

顶下先,现在没有时间,等会帮你写,感觉不难的啊。


如果t1,t2,t3是红色,那么现在点了t1,,,,t15,是不是t1,t2,t3要变白色啊? 

t1,t2,t3当然还是红色的啊。 --------------------编程问答--------------------
引用 3 楼 zzyhuian06142 的回复:
有没有可能说点T1和T15 
这样第一行到第二行的T15都要红色的?


点t1和t15,t1,t2,t3,t13,t14,t15变红色.
点t1和t60则全部为红色; --------------------编程问答-------------------- 这个简单,就象做过的一个高尔夫球的打位管理一样。 --------------------编程问答-------------------- 实现鼠标拖拉式

 

public partial class Form1 : Form
    {
        int pointX = 0;
        int pointY = 0;
        int top, buttom, left, right;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            pointX = e.X;
            pointY = e.Y;
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            top = e.Y < pointY ? e.Y : pointY;
            buttom = e.Y > pointY ? e.Y : pointY;
            left = e.X < pointX ? e.X : pointX;
            right = e.X > pointX ? e.X : pointX;
            SetRed(textBox1);
            SetRed(textBox2);
            SetRed(textBox3);
            SetRed(textBox4);
            SetRed(textBox5);
            
        }
        private void SetRed(TextBox tb)
        {
            if (tb.Top + tb.Size.Height > top && tb.Right > left && tb.Top < buttom && tb.Left < right)             
            {
                tb.BackColor = Color.Red;
            }
        }

        /*
        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.BackColor = Color.White;
            textBox2.BackColor = Color.White;
            textBox3.BackColor = Color.White;
            textBox4.BackColor = Color.White;
            textBox5.BackColor = Color.White;
        }*/
    }




做了5个textbox测试没什么问题 --------------------编程问答-------------------- 学习了。
我再来稍微完善一下
1、窗体Load中加入
this.groupBox1.MouseDown += new MouseEventHandler(Form1_MouseDown); 
this.groupBox1.MouseUp += new MouseEventHandler(Form1_MouseUp);

2、
//SetRed(textBox1);
//SetRed(textBox2);
//SetRed(textBox3);
//SetRed(textBox4);
//SetRed(textBox5);
foreach (Control col in this.groupBox1.Controls)
{
    if (col.GetType() == typeof(TextBox))
        SetRed((TextBox)col);
}
--------------------编程问答-------------------- 9楼的方法确实是实现了拖拉效果,

//SetRed(textBox1);
//SetRed(textBox2);
//SetRed(textBox3);
//SetRed(textBox4);
//SetRed(textBox5);
必须放到按钮的点击事件里才行哦。 放在MouseUp事件里好像没用。 --------------------编程问答-------------------- s330481,你从t1拖到t3只有t1,t2,t3变红色? t4,t5不会?
我拿你代码贴上去,怎么弄都是t1,t2,t3,t4,t5全变红色 --------------------编程问答--------------------
引用 15 楼 My_xinshou 的回复:
s330481,你从t1拖到t3只有t1,t2,t3变红色? t4,t5不会? 
我拿你代码贴上去,怎么弄都是t1,t2,t3,t4,t5全变红色


晕,我把SetRed(textBox1); 。。。。。。。。。写到鼠标点击事件里面去了
--------------------编程问答-------------------- 首先你命名的就不好,为什么要从t1一直到t60呢?这样你下面这个算法写起来多麻烦。
如果我是你,我会新建一个TextBox的二维数组,


TextBox [][]t = new TextBox[5][12];
for (int i= 0; i < 5; i++)
for (int j = 0;  j < 12 ;j++)
t[i][j] =  new TextBox();
//下面设置位置和点击相应参数也是用循环设定。此处略去


然后你的算法就很容易实现了嘛,比如你第一下点的是t[i1][j1],第二下点的是t[i2][j2]


for (int i1= 0; i< i2; i++)
for (int j1= 0;  j< j2;j++)
t[i][j].Color = Color.red;


这样不就行了,我没有编译器,所以只能说个大概思路,不能帮你调试通过了。 --------------------编程问答-------------------- 对噢,二维数组。。但是我还是不知道怎么实现。根据你的思路再想想 --------------------编程问答-------------------- 唉,我还没用过数组。 --------------------编程问答-------------------- TextBox [][]t = new TextBox[5][12];
这句话是c++的写法,C#中的写法应该是
TextBox [,]t =  new TextBox [5,12]; --------------------编程问答-------------------- 你所有的TextBox几乎一样,形状,大小,处理函数……除了位置是顺序变化的,我看不出不用数组的理由
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,