2

単一のテキスト文字を含むDataGridViewがあります。基本的に文字コード表のようですが、テキストのようにセルのグループを左から右に選択できるようにしたいと考えています。

つまり、垂直方向に2つのセルを選択した場合のデフォルトの動作は、それらの2つのセルのみが選択されることです。ただし、一番上の行の右側と2番目の行の左側にあるすべてのセルを選択するようにします。この質問テキストで2つの縦の文字を強調表示する場合と同じように。

出来ますか?(そして、私はそれを意味のある方法で説明することができましたか?!)

ありがとう!

編集:これをよりよく説明するのに役立ついくつかの画像を追加しました。

まず、「P」を選択して「d」までドラッグすると、これが選択されます。 デフォルトのDataGridViewの動作

この場合に私がしたいのはこれです: ここに画像の説明を入力してください

うまくいけば、これはそれをより明確にするでしょう、ありがとう:)

4

2 に答える 2

1

これはうまくいきます、見てください

private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.DataSource = li;
        dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
        dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;
    }

    private void dataGridView1_SelectionChanged(object sender, EventArgs e)
    {
        var la = dataGridView1.SelectedCells;
        if (la.Count == 2)
        {
            var rowFirst = ((DataGridViewCell)la[0]).RowIndex;
            var columnFirst = ((DataGridViewCell)la[0]).ColumnIndex;

            var rowSecond = ((DataGridViewCell)la[1]).RowIndex;
            var columnSecond = ((DataGridViewCell)la[1]).ColumnIndex;

            for (int column = 0; column <= columnFirst; column++)
            {
                dataGridView1[column, rowFirst].Selected = true;
            }

            for (int column = columnSecond; column < dataGridView1.ColumnCount; column++)
            {
                dataGridView1[column, rowSecond].Selected = true;
            }
        }
    }
于 2013-02-28T21:28:58.513 に答える
0

simple-thomas の回答をより一般的なソリューションで拡張して、これを思いつきました。縮小する選択範囲をうまく処理できませんが、私の目的には十分です。シンプルトーマスありがとう!

    private void characterGrid_SelectionChanged( object sender, EventArgs e )
    {
        if ( SelectionChanging == true )
        {
            return;
        }

        SelectionChanging = true;

        var la = characterGrid.SelectedCells;
        if ( la.Count > 1 )
        {
            var sorted = new List<DataGridViewCell>();
            System.Collections.IEnumerator enumerator = la.GetEnumerator();
            while ( enumerator.MoveNext() )
            {
                sorted.Add( (DataGridViewCell)enumerator.Current );
            }
            sorted.Sort( delegate( DataGridViewCell t1, DataGridViewCell t2 )
            {
                if ( t1.RowIndex != t2.RowIndex )
                {
                    return t1.RowIndex.CompareTo( t2.RowIndex );
                }
                else
                {
                    return t1.ColumnIndex.CompareTo( t2.ColumnIndex );
                }
            });

            var rowFirst = ( (DataGridViewCell)sorted[ 0 ] ).RowIndex;
            var columnFirst = ( (DataGridViewCell)sorted[ 0 ] ).ColumnIndex;

            var rowLast = ( (DataGridViewCell)sorted[ sorted.Count - 1 ] ).RowIndex;
            var columnLast = ( (DataGridViewCell)sorted[ sorted.Count - 1 ] ).ColumnIndex;

            if ( rowLast > rowFirst )
            {
                // select first row
                for ( int column = columnFirst; column < characterGrid.ColumnCount; column++ )
                {
                    characterGrid[ column, rowFirst ].Selected = true;
                }

                // in between
                for ( int row = rowFirst + 1; row < rowLast; row++ )
                {
                    for ( int column = 0; column < characterGrid.ColumnCount; column++ )
                    {
                        characterGrid[ column, row ].Selected = true;
                    }
                }

                // last row
                for ( int column = 0; column <= columnLast; column++ )
                {
                    characterGrid[ column, rowLast ].Selected = true;
                }
            }
        }

        SelectionChanging = false;
    }
于 2013-02-28T22:13:30.420 に答える