none
選択されたセルに連動してその横にListBoxを表示したい RRS feed

  • 質問

  • zen73です。次から次へとわからないことが連続して皆さんにお世話になりっぱなしですが、その都度に御親切な回答をいただいておりますことにお礼申し上げます。

    今回は、ListBoxを表示する際の位置指定についての質問です。

            listBox1.Location.Y = MinPos0;

    と、位置指定をしましたところ、

       「変数ではないため、'System.windows.Forms.Contorol.Location'の戻り値を変更できません」

    とのエラーが出てしまいました。

    コード ブロック

           private void lbxPosition(int iRow, object sender)
            {
                DataGridView dgv = (DataGridView)sender;
                int MinPos0;    //listBox表示の上限
                int MaxPos1;    //listBox1表示の下限
                int halfHeight1;//listBox1の高さの半分
                int CellY;      //現在のセル位置

                MinPos0 = dgv.Location.Y + dgv.ColumnHeadersHeight;
                MaxPos1 = MinPos0 + dgv.Height - listBox1.Height;
                halfHeight1 = listBox1.Height / 2;
                CellY = dgv.RowTemplate.Height * iRow;
                if ((CellY - halfHeight1) > MaxPos1)
                {
                    listBox1.Location.Y = MaxPos1;
                }
                else if ((CellY - halfHeight1) > MinPos0)
                {
                    listBox1.Location.Y = CellY - halfHeight1;
                }
                else
                {
                    listBox1.Location.Y = MinPos0;
                }
            }

     

     

    2007年10月8日 2:56

回答

  • listBox1.LocationはPoint構造体を返します。つまり値型であるため、その時点でPoint構造体のコピーが作られます。

    そのコピーのYにいくら値を設定しても、listBox1とは無関係です。

    なので、listBox1.LocationにPoint構造体自体を与えなければなりません。

     

    listBox1.Location = new Point(x, y);

    2007年10月8日 5:52
    モデレータ

すべての返信

  • listBox1.LocationはPoint構造体を返します。つまり値型であるため、その時点でPoint構造体のコピーが作られます。

    そのコピーのYにいくら値を設定しても、listBox1とは無関係です。

    なので、listBox1.LocationにPoint構造体自体を与えなければなりません。

     

    listBox1.Location = new Point(x, y);

    2007年10月8日 5:52
    モデレータ
  • お早うございます、zen73です。すぐに回答をいただきましたのに、コードの修正に戸惑ってお礼を申すのが遅れてしまいましたがお蔭様でうまく解決することができました。trapemiyaさん、ありがとうございました。

    コード ブロック

        private void lbxPosition(int iCol, int iRow, object sender)
            {
                DataGridView dgv = (DataGridView)sender;
                int MinPos0;    //listBox表示の上限
                int MaxPos1;    //listBox1表示の下限
                int MaxPos2;    //listBox2表示の下限
                int cellY;      //現在のセル位置
                int X;

                MinPos0 = dgv.Top + dgv.ColumnHeadersHeight;
                cellY = MinPos0 + dgv.RowTemplate.Height * iRow + 10;
                switch (iCol)
                {
                    case 3:
                        MaxPos1 = dgv.Bottom - listBox1.Height;
                        X = 280;
                        cellY -= listBox1.Height / 2;
                        if (cellY < MinPos0)
                        {
                            listBox1.Location = new Point(X, MinPos0);
                        }
                        else if (cellY < MaxPos1)
                        {
                            listBox1.Location = new Point(X, cellY);
                        }
                        else
                        {
                            listBox1.Location = new Point(X, MaxPos1);
                        }
                        break;
                    case 5:
                        MaxPos2 = dgv.Bottom - listBox2.Height;

                    -------------------

                }

           }

     

     

    2007年10月8日 22:20