昨天发帖没解决,今天再发一次。求一算法.
上图的方框是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,下午有时间帮你搞搞 --------------------编程问答--------------------
谢谢,我脑瓜子弄不好算法东西。。唉 --------------------编程问答-------------------- 有没有可能说点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))
} --------------------编程问答--------------------
另:
如果t1,t2,t3是红色,那么现在点了t1,,,,t15,是不是t1,t2,t3要变白色啊?
顶下先,现在没有时间,等会帮你写,感觉不难的啊。 --------------------编程问答--------------------
T15是第2层的,不要红色。。 --------------------编程问答--------------------
如果t1,t2,t3是红色,那么现在点了t1,,,,t15,是不是t1,t2,t3要变白色啊?
t1,t2,t3当然还是红色的啊。 --------------------编程问答--------------------
点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);--------------------编程问答-------------------- 9楼的方法确实是实现了拖拉效果,
//SetRed(textBox2);
//SetRed(textBox3);
//SetRed(textBox4);
//SetRed(textBox5);
foreach (Control col in this.groupBox1.Controls)
{
if (col.GetType() == typeof(TextBox))
SetRed((TextBox)col);
}
//SetRed(textBox1);
//SetRed(textBox2);
//SetRed(textBox3);
//SetRed(textBox4);
//SetRed(textBox5);
必须放到按钮的点击事件里才行哦。 放在MouseUp事件里好像没用。 --------------------编程问答-------------------- 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#