views:

17

answers:

0

Given two related tables (reports, report_fields) where there can be many report_fields entries for each reports entry, I need to allow the user to enter new report_fields, delete existing report_fields, and re-arrange the order.

Currently I am using a DetailsView to handle the editing of the reports. I added some logic to handle report_fields, and currently it allows you to succesfully re-arrange the order, but i'm a little stumped as to the best way to add new items, or delete existing items.

The basic logic I have is that each report_fields is represented by a . It has a description as the text, and a field for each field in the report_fields table. I use JQuery Sortable to allow the user to re-arrange the LIs.

Abbreviated Create Table Statements:(foreign key constraint ignored for brevity)

create table report(
 id integer primary key identity,
 reportname varchar(250)
)
create table report_fields(
 id integer primary key identity,
 reportID integer,
 keyname integer,
 keyvalue integer,
 field_order integer
)

My abbreviated markup:

<asp:DetailsView ...>
 ...
 <asp:TemplateField  HeaderText="Fields">
  <EditItemTemplate>
   <ul class="MySortable">
    <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("report_fields") %>'>
     <ItemTemplate>
      <li>
       <%# Eval("keyname") %>: <%# Eval("keyvalue") %>
       <input type="hidden" name="keyname[]" value='<%# Eval("keyname") %>' />
       <input type="hidden" name="keyvalue[]" value='<%# Eval("keyvalue") %>' />
      </li>
     </ItemTemplate>
    </asp:Repeater>
   </ul>
  </EditItemTemplate>    
 </asp:TemplateField>  
    </asp:DetailsView>
    <asp:LinqDataSource ID="LinqDataSource2" onupdating="LinqDataSource2_Updating" table=reports ... />
$(function() {
 $(".MySortable").sortable({
  placeholder: 'MySortable-highlight'
 }).disableSelection();
});

Code Behind Class:

public partial class Administration_AddEditReport
 protected void LinqDataSource2_Updating(object sender, LinqDataSourceUpdateEventArgs e)
 {
  report r = (report)e.NewObject;
  MyDataContext dc = new MyDataContext();
  var fields = from f in dc.report_fields
   where f.reportID == r.id
   select f;
  dc.report_fields.DeleteAllOnSubmit(fields);

  NameValueCollection nvc = Request.Params;
  string[] keyname = nvc["keyname[]"].Split(',');
  string[] keyvalue = nvc["keyvalue[]"].Split(',');
  for (int i = 0; i < keyname.Length; i++)
  {
   report_field rf = new report_field();
   rf.reportID = r.id;
   rf.keyname = keyname[i];
   rf.keyvalue = keyvalue[i];
   rf.field_order = i;
   dc.report_fields.InsertOnSubmit(rf);
  }

  dc.SubmitChanges();
 }
    }