- 題名: 参照型の変数を値型として使う方法?
- 日時: 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 などでも、よく同じ悩みに直面します。
表現として正しいのか判りませんが、参照型の変数を値型として使う方法を教えてください。
よろしくお願いします。