1

私は crossWord プログラムを書いています。最初に、ユーザーは数字 "n" を入力し、白色で空白の TextBox を持つ * n テーブルを作成する必要があります。テーブルを作成した後、ユーザーがいくつかの家をクリックすると、家の背景色が黒に変わります。

私の質問は、この手順の後で、黒色の TextBoxes の数、白色の TextBox の数、水平方向または垂直方向の列で黒のない連続した白いテキスト ボックスの最大数を検出して、一致する単語を貼り付けるにはどうすればよいですか?彼らへ!

ここに画像の説明を入力

上記の表では、フォームは、2 番目の水平行または 2 番目の垂直行で 5 が最大の白い連続したテキスト ボックスであることを検出する必要があります。

ここに私のコードスニペンがあります:

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以下のアイテムを入手するにはどうすればよいですか。

4

2 に答える 2

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 上記のコードは、水平線の最大連続ホワイトボックスのラインインデックスを取得します。

于 2014-06-14T06:32:46.273 に答える