- - PR -
DataGridの追加、変更、削除処理について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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-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" /> | ||||
|
投稿日時: 2004-11-30 21:52
ページロードイベントハンドラは、どのように書いてます? | ||||
|
投稿日時: 2004-11-30 22:25
とっちんさん、Jittaさん回答ありがとうございました。
とっちんさんへ データグリッド上で変更されたデータをArrayListに格納し、一括更新する方法もあるんですね。参考にさせていただきます。 Jittaさんへ ページロードイベントハンドラ(Form1_Load)では、データグリットに関する 記述はしていません。今回はボタン押下によってデータグリットを表示し、 WinアプリC#で開発なので、最初にロードをするだけと考えていたのですが、、、 ページロードイベントハンドラにデータグリットについて記述する必要があるんでしょうか?? C#並びにDataGridについて未熟者ですが回答よろしくお願いします。 | ||||
|
投稿日時: 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
