1

datasourceプロパティを使用してデータテーブルから入力されたdatagridviewがあります。データベースに影響を与えずにセルの値を変更する必要があります。これまでのところ、最初にデータバインドされたアイテムを変更する必要があることだけがわかりましたが、その方法に関する情報はありませんでした。また、データバインドされたアイテムを変更したくありません。

これを実行したい理由は、開始時刻と終了時刻のレコードのリストがあり、秒単位で差を与える計算フィールドがあるためです。計算フィールドの値を変更し、それに応じて行の高さを変更する必要があります。つまり、各行の高さは、それが表す期間に比例します。変更は、「増加」ボタンを押したままにするとすばやく増加するテキストボックスから行われるため、増加するたびにデータベースを変更することはできません。むしろ、テーブルの値を頻繁に変更し、増分が停止したらデータベースを更新します。

このコードを使用してdatagridviewを直接更新しようとしました:

dgvTasks.Rows(SelectedRowIndex).Cells(5).Value = DateAdd(DateInterval.Minute, DateDiff(DateInterval.Minute, CDate("00:00:00"), CDate(txtDuration.Text & ":00")), dgvTasks.Rows(SelectedRowIndex).Cells(4).Value)

しかし、エラーを受け取ります:

System.Data.ReadOnlyException:列'Column1'は読み取り専用です。

また、データテーブルを更新し、計算列を更新できるようにしてみました。

dtblTasks.Rows(SelectedRowIndex)(5) = DateAdd(DateInterval.Minute, DateDiff(DateInterval.Minute, CDate("00:00:00"), CDate(txtDuration.Text & ":00")), dtblTasks.Rows(SelectedRowIndex)(4)) 
dgvTasks.DataSource = dtblTasks

ただし、計算値は変わりません。

また、(SQLで)追加の​​計算値を提供しています。ここで、分単位の差を見つけ、それに文字列リテラルを追加します。

( CAST ( DATEDIFF(MINUTE, Tasks.TaskStart, Tasks.TaskEnd) AS NVARCHAR(10) ) + ' mins') AS TaskDurationString

グリッドをデータソースから切り離し、データをデータグリッドに表示したまま、(データバインドされたオブジェクトに影響を与えずに)操作する方法はありますか?それとも、この問題に対する他のアプローチですか?

4

1 に答える 1

3

で計算された列を更新することは機能するDataTableはずです-私はそれを試しました、そして計算された値の一部である値の1つを編集するとき、そしてコードで値を変更するときの両方で、その列は再計算され、グリッドUI更新。

確認すべきことの1つは、値を正しく計算していることです。DataTable~ column [Expression`プロパティを使用する必要があります] 1。このようなもの:

dt.Columns["FullName"].Expression = "FirstName + LastName";

これらの値を実際にデータベースにバインドしDataTableたり、データベースに永続化したりする必要はないように思われるため、考えられる解決策の1つは、バインドされていないDataGridView計算列でこれらすべてを実行することです。

これを行うには、デザイナーを使用して列を追加し、セル検証イベントで次のようにします。

void dataGridView1_CellValidated(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.Rows[e.RowIndex].Cells["TargetColumn"].Value = dataGridView1.Rows[e.RowIndex].Cells["FirstName"].Value.ToString() + dataGridView1.Rows[e.RowIndex].Cells["LastName"].Value.ToString();
    dataGridView1.Rows[e.RowIndex].Height = dataGridView1.Rows[e.RowIndex].Cells["LastName"].Value.ToString().Length + dataGridView1.Rows[e.RowIndex].Cells["FullName"].Value.ToString().Length;
}
于 2012-11-01T20:04:13.473 に答える