- PR -

DataGridの追加、変更、削除処理について

1
投稿者投稿内容
会議室デビュー日: 2004/09/18
投稿数: 4
投稿日時: 2004-11-30 17:16
条件にあったDBレコードの対象カラムのみをDataGridに表示し、ユーザにDataGrid上で自由に追加、変更、削除できる処理をさせようと考えています。
(DBへの更新は、別途にボタンを用意しています。)
現在、表示はできるのですが、変更すると、表示が元に戻ってしまったり、コミットエラーMSGが表示されます。
どなたかDataGrid上で追加、変更、削除ができる方法のご教示をお願いします。(以下がソースになります。)

private void btnEnt_Click(object sender, System.EventArgs e)

{
Dataset1 ds1 = new Dataset1();
sqlDataAdapter1.Fill(ds1,"テーブル名");
DataView dtView = new DataView();
dtView.Table = ds1.Tables[0];
dtView.RowFilter = 条件;
dataGrid1.DataSource = dtView;

//項番入力
//ダミーカラムを設定しています。
int dtRC = dataGrid1.BindingContext[dataGrid1.DataSource,dataGrid1.DataMember].Count;
for(int C=0;C<dtRC;C++)
{
dataGrid1[C,0] = C + 1;
}

//ソート禁止
dataGrid1.AllowSorting = false;

}
とっちん
会議室デビュー日: 2004/11/22
投稿数: 18
投稿日時: 2004-11-30 20:26
こんにちは。
データグリッド上で変更されたデータをArrayListに格納し、一括更新するというのはどうでしょう?

<script runat="server">
Protected arr As ArrayList = New ArrayList()

Sub Page_Load(sender As Object, e As EventArgs)
  If Not Page.IsPostBack Then
    arr.Clear()
    arr.TrimToSize()
    BindDataGrid()
  End If
End Sub

Sub BindDataGrid()
  '(データ取得処理)
  gd.DataBind()
End Sub

Sub btnupdate_Click(sender As Object, e As EventArgs)
  Dim dgi As DataGridItem
  Dim intkey As Integer
  Dim strname As String
  For Each dgi in gridsel.Items
    intkey = Int32.Parse(CType(dgi.FindControl("txtkey"), TextBox).Text)
    If arr.Contains(intkey) Then
      strname = CType(dgi.FindControl("txtname"), TextBox).Text
      '(更新&削除処理)
    End If
  Next
  arr.Clear()
  arr.TrimToSize()
  BindDataGrid()
End Sub

Protected Sub txtname_TextChanged(sender As Object, e As EventArgs)
  Dim dgi As DataGridItem = CType(CType(sender, Control).NamingContainer, DataGridItem)
  Dim intkey As Integer = Int32.Parse(CType(dgi.FindControl("txtkey"), TextBox).Text)
  If Not (arr.Contains(intkey)) Then
    arr.Add(intkey)
  End If
End Sub

</script>

<asp:DataGrid id="gd" runat="server" AutoGenerateColumns="false">
 <Columns>
   <asp:TemplateColumn HeaderText="キー">
    <ItemTemplate>
     <asp:TextBox id="txtkey" runat="server"
     Text='<%# CType(DataBinder.Eval(Container.DataItem, "key"), Integer) %>' />
    </ItemTemplate>
   </asp:TemplateColumn>
   <asp:TemplateColumn HeaderText="名前">
    <ItemTemplate>
     <asp:TextBox id="txtname" runat="server"
     OnTextChanged="txtname_TextChanged"
     Text='<%# CType(DataBinder.Eval(Container.DataItem, "name"), String) %>' />
    </ItemTemplate>
   </asp:TemplateColumn>
  <asp:TemplateColumn HeaderText="削除">
   <ItemTemplate>
    <asp:CheckBox id="chkdel" runat="server" />
   </ItemTemplate>
  </asp:TemplateColumn>
 </Columns>
</asp:DataGrid>
<asp:Button id="btnupdate" Text="一括更新" onClick="btnupdate_Click" runat="server" />
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-30 21:52
引用:

雪さんの書き込み (2004-11-30 17:16) より:


ページロードイベントハンドラは、どのように書いてます?
会議室デビュー日: 2004/09/18
投稿数: 4
投稿日時: 2004-11-30 22:25
とっちんさん、Jittaさん回答ありがとうございました。

とっちんさんへ

データグリッド上で変更されたデータをArrayListに格納し、一括更新する方法もあるんですね。参考にさせていただきます。

Jittaさんへ

ページロードイベントハンドラ(Form1_Load)では、データグリットに関する
記述はしていません。今回はボタン押下によってデータグリットを表示し、
WinアプリC#で開発なので、最初にロードをするだけと考えていたのですが、、、
ページロードイベントハンドラにデータグリットについて記述する必要があるんでしょうか??


C#並びにDataGridについて未熟者ですが回答よろしくお願いします。




Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-01 19:00
 あ、AI Lightでも聞かれてますね(これ)。あっちはカテゴリ選択で「Win」があるもんな。

 ん〜と、"オブジェクトの有効期間"というものを意識しながら、プログラムしなければなりません。この場合、データセットds1です。
 これ、btnEntですが、なんのボタンですか?「表示」かな?そして、おそらく削除や変更ボタンでも、同じようにds1をnewして、Fillしていませんか?そうではなく、フォームクラスのprivateなクラス変数として、データセットを宣言します。表示ボタンで作ったら、削除、更新は、このデータセットに対して、操作を行うようにします。
こんなイメージ↓
[code]
class Form1 : System... {
private DataSet myDataSet = null;
...
表示させるイベントハンドラ {
myDataSet = new DataSet();
テーブルを追加
ビューを作成
DataGridにバインド
}
確定するイベントハンドラ {
データアダプタ.Update(myDataSet);
}
}

_________________
1

スキルアップ/キャリアアップ(JOB@IT)