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