- 題名: 参照型の変数を値型として使う方法?
- 日時: 2010/11/27 12:56:07
- ID: 27666
- この記事の返信元:
- (なし)
- この記事への返信:
- [27667] Re[1]: 参照型の変数を値型として使う方法?2010/11/27 13:12:44
- [27668] Re[1]: 参照型の変数を値型として使う方法?2010/11/27 13:27:26
- ツリーを表示
■No27670に返信(muuuuさんの記事)
> 理解不足が原因です。
流れを追ってみましょうか。
>> DataGridViewRow ターゲット行データ = dgv.Rows[ターゲット行];
変数に「タ―ゲット行」への参照が入りますよね。両者は同じものなので、
「ターゲット行データ」に対して何か操作を行った場合、それは
「dgv.Rows[ターゲット行]」に対しても影響を与えます。逆もしかり。
という事は、その後に実行した
>> dgv.Rows[ターゲット行].Cells[1].Value = dgv.Rows[入れ替え行].Cells[1].Value;
この処理は、結局のところ、
ターゲット行データ.Cells[1].Value = dgv.Rows[入れ替え行].Cells[1].Value;
と同じ意味になってしまうというわけです。
つまりこの時点で、
( タ―ゲット行 ).Cells[1].Value
dgv.Rows[ターゲット行].Cells[1].Value
dgv.Rows[ 入れ替え行 ].Cells[1].Value
は、全て同じ値になっているわけですね。
> やはり参照型を簡単に扱うのは難しいのでしょうか。
特に難しいと感じていないので、これについてはコメントできません。(^^;
> データの数が多くなるほどに、値まで降りてくるのが
値を入れ替えるのですから、値を取得しないと。
(データバインドしている場合は、バインド元を入れ替える形でも良いですが)
たとえば、フォームに GroupBox を 2 つ貼って、
それぞれに TextBox を載せてください。下記の階層構造にします。
Form
├groupBox1
│└textBox1
├groupBox2
│└textBox2
├button1
├button2
└dataGridView1
さて、ここで下記のようなコードを書いてみます。
先ほどの DataGridViewRow の時と同じような結果になりますが、
それぞれの違いは分かりますか?
int 元 = 1;
int 先 = 3;
private void button1_Click(object sender, EventArgs e)
{
object tmp = dataGridView1[1, 元].Value;
dataGridView1[1, 元].Value = dataGridView1[1, 先].Value;
dataGridView1[1, 先].Value = tmp;
string s = textBox1.Text;
textBox1.Text = textBox2.Text;
textBox2.Text = s;
}
private void button2_Click(object sender, EventArgs e)
{
DataGridViewRow tmp = dgv.Rows[元];
dataGridView1.Rows[元].Cells[1].Value = dataGridView1.Rows[先].Cells[1].Value;
dataGridView1.Rows[先].Cells[1].Value = tmp.Cells[1].Value;
GroupBox gb = groupBox1;
groupBox1.Controls["textBox1"].Text = groupBox2.Controls["textBox2"].Text;
groupBox2.Controls["textBox2"].Text = gb.Controls["textBox1"].Text;
}
private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.ColumnCount = 3;
dataGridView1.Rows.Add(11, 12, 13);
dataGridView1.Rows.Add(21, 22, 23);
dataGridView1.Rows.Add(31, 32, 33);
dataGridView1.Rows.Add(41, 42, 43);
dataGridView1.Rows.Add(51, 52, 53);
dataGridView1.AutoResizeColumns();
textBox1.Text = "aaa";
textBox2.Text = "bbb";
}
分類:[.NET]
VisualStudio2008 C# を使っています。
タイトルが適切な表現なのはわからないのですが…
次のようなコードで処理を実行すると意図しない動作になります。
DataGridViewRow ターゲット行データ = dgv.Rows[ターゲット行];
dgv.Rows[ターゲット行].Cells[1].Value = dgv.Rows[入れ替え行].Cells[1].Value;
dgv.Rows[入れ替え行].Cells[1].Value = ターゲット行データ.Cells[1].Value;
ターゲット行データが参照型なので、元データが変更されると影響を受ける。
からだと思います。
影響を受けないようにターゲット行データを切り離してコピーしたいのですが、
その方法がわかりません。
DataGridViewRowに限らず、XElement などでも、よく同じ悩みに直面します。
表現として正しいのか判りませんが、参照型の変数を値型として使う方法を教えてください。
よろしくお願いします。