我正在编写crossWord程序 首先,用户必须输入数字“n”,并创建一个n * n表,其中TextBoxes为白色且为空白。 建立桌子后,用户点击几个房子,房子背景颜色变为黑色。
我的问题是在这个步骤之后,黑色中有多少个TextBox,有多少是白色,如何在水平或垂直列中检测到没有任何黑色的连续白色文本框的最大数量,以粘贴与他们匹配的单词!
在上表中,表格必须检测第5个是第二个水平线或第二个垂直线中的白色连续文本框的最大值,用户填写后必须在第一个水平线显示4个最大值,然后继续...
这是我的代码片段:
private void CreateCrossTable()
{
int count = Convert.ToInt32(textBox1.Text.Trim());
if (count > 10)
count = 10;
int x = 100, y = 100;
const int value = 100;
for (int i = 1; i <= count; i++)
{
for (int j = 1; j <= count; j++)
{
x = value + (j * 20);
TextBox tb = new TextBox();
tb.Name = "txtbox" + i + "-" + j;
tb.Location = new Point(x, y);
tb.Size = new System.Drawing.Size(20, 20);
tb.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.txtMouseDoubleClick);
Controls.Add(tb);
}
y = value + (i * 20);
}
}
private void txtMouseDoubleClick(object sender, MouseEventArgs e)
{
TextBox tb = (TextBox)sender;
tb.BackColor = Color.Black;
tb.Enabled = false;
tb.Text = "|";
}
所以,现在我使用LINQ来获取所有白色文本框:
IEnumerable<TextBox> FreeItems = frm.Controls.OfType<TextBox>().Where(I => I.BackColor != Color.Black);
我怎样才能获得那些白色且X位置差异不超过20的物品!
答案 0 :(得分:2)
尝试以下示例
private void findConsecutive()
{
var vertical = (from Control cnt in pnlCrossWord.Controls
where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
orderby cnt.Top
select cnt.Top).Distinct().ToArray();
var horizontal = (from Control cnt in pnlCrossWord.Controls
where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
orderby cnt.Left
select cnt.Left).Distinct().ToArray();
List<int> vList = new List<int>();
int iIndex = 0;
foreach (int top in vertical)
{
vList.Add(0);
int vIndex = 0;
int iConsecutive = 0;
int iLastLeft = -1;
var Item = (from Control cnt in pnlCrossWord.Controls
where (cnt.GetType().Name.Equals("TextBox")) && (!cnt.BackColor.Equals(Color.Black))
&& (cnt.Top.Equals(top))
select (TextBox)cnt).ToArray();
foreach (TextBox txt in Item)
{
if ((iLastLeft + txt.Width) < txt.Left && iLastLeft > -1)
{
if (iConsecutive > vList[iIndex])
vList[iIndex] = iConsecutive;
iConsecutive = 0;
}
iConsecutive++;
iLastLeft = txt.Left;
vIndex++;
}
if (iConsecutive > vList[iIndex])
vList[iIndex] = iConsecutive;
iIndex++;
}
int MaxConsicutiveIndex = vList.IndexOf(vList.Max());
}
<强> EDITED 强> 上面的代码将检索水平线上最大串行白框的线索引。
答案 1 :(得分:0)
您需要一个允许您动态排列单元格的布局容器。表应该有用。
对于每个单元格存储标记属性中的x,y位置。
当用户点击特定单元格时,很容易编写一个方法,该方法为您提供同一行中的单元格或文本框的集合。或者,如果您想在单击按钮后找到答案,则必须遍历所有行。
这应该让你在一个好地方完成剩下的工作。