2012-06-14 1 views
0

У меня возникла проблема с реализацией редактируемого GridView с использованием ObjectDataSource на CodeBehind; Интересно, что недостающие кусочки мне нужно добавить в моем коде позади (события):Как обновить строку GridView ASP.NET с ObjectDataSource с кодом по программному адресу

ASPX Код:

<asp:GridView ID="grdPlayer" runat="server" AutoGenerateColumns="False" 
      AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" 
      onrowediting="grdPlayer_RowEditing" 
      onrowcancelingedit="grdPlayer_RowCancelingEdit" 
onrowupdating="grdPlayer_RowUpdating"> 
      <Columns> 
       <asp:BoundField DataField="ID" Visible="false"/> 
       <asp:BoundField DataField="FirstName" HeaderText="First Name" 
        SortExpression="FirstName" /> 
       <asp:BoundField DataField="LastName" HeaderText="LastName" 
        SortExpression="LastName" /> 
       <asp:BoundField DataField="Age" HeaderText="Age" 
        SortExpression="Age" /> 

      </Columns> 


     </asp:GridView> 

ASPX.CS Код За:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Data; 

    public partial class _Default : System.Web.UI.Page 
    { 
     ObjectDataSource dataSource = new ObjectDataSource(); 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 

       dataSource.TypeName = "Cricket.CricketBL"; 
       dataSource.UpdateMethod = "UpdatePlayer"; 
       Parameter p1 = new Parameter("ID", DbType.Int32); 
       Parameter p2 = new Parameter("FName", DbType.String); 
       Parameter p3 = new Parameter("LName", DbType.String); 
       Parameter p4 = new Parameter("Age", DbType.Int32); 
       dataSource.UpdateParameters.Add(p1); 
       dataSource.UpdateParameters.Add(p2); 
       dataSource.UpdateParameters.Add(p3); 
       dataSource.UpdateParameters.Add(p4); 

       bindGridView(); 

      } 
     } 

     #region Grid Events 
     protected void grdPlayer_RowEditing(object sender, GridViewEditEventArgs e) 
     { 
      grdPlayer.EditIndex = e.NewEditIndex; 
     } 

     protected void grdPlayer_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
      grdPlayer.EditIndex = -1; 
      bindGridView(); 


     } 



     protected void grdPlayer_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
      grdPlayer.EditIndex = -1; 
      bindGridView(); 
     } 
     #endregion 

     void bindGridView() 
     { 
      dataSource.SelectMethod = "GetAllPlayer"; 
      dataSource.TypeName = "Cricket.CricketBL"; 
      grdPlayer.DataSource = dataSource; 
      grdPlayer.DataBind(); 
     } 
    } 
  1. Где я должен поставить код UpdateMethod (в настоящее время в Page_Load)?
  2. Какие события следует реализовать в коде, чтобы измененная строка сетки вызывала UpdateMethod с помощью правильных NewValues?
  3. Когда я нажимаю ссылку «Редактировать», он не отображает GridView в режиме редактирования (текстовые поля и т. Д.); Я должен щелкнуть дважды, чтобы сделать это; Зачем?
  4. БОЛЬШОЙ ВОПРОС: Щелчок по ссылке «Обновить» не вызывает ObjectDataSource UpdateMethod?
+0

Вы не используете objectDataSource в своем коде! – dotfreelancer

ответ

0

Zee,

Ваш подход хорош только для изучения фазы. Для лучшей практики или на этапе производства мы должны всегда четко разделять несколько слоев приложения. Это главным образом уровень доступа к данным (DAL), уровень бизнес-логики (BLL) и уровень презентации (в веб-страницах). Такое понятие часто называют ненасыщением сохранения. Как пояснил here

Методы CRUD, которые называют класс хранилища и два конструктора делают возможным использование бизнес-логики класса с любыми фоновым хранилища данных вы выбираете. Класс бизнес-логики не должен знать о том, как класс, который он вызывает, сохраняет данные. (Это часто называют незнанием незнания.)

Я настоятельно рекомендую вам пройти через это awesome tutorial и продолжить работу дальше, и вы будете просветлены!

0

Zee,

Чтобы ответить на ваши 4 вопроса.

1 И 4:

Добавьте «onRowUpdated» к свойствам gridview в вашем .aspx-файле. Скажем onRowUpdated = "grdPlayer_RowUpdated". Добавьте свой код для обновления здесь.

2 и 3:

Вместо того чтобы использовать BoundField, почему бы не использовать TemplateField. Это будет иметь EditItemTemplate и ItemTemplate так:

<asp:TemplateField HeaderText="FirstName"> 
    <EditItemTemplate> 
     <asp:TextBox ID="FName" runat="server" Text='<%# Bind("FirstName")%>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("FirstName") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="LastName"> 
    <EditItemTemplate> 
     <asp:TextBox ID="LName" runat="server" Text='<%# Bind("LastName") %>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("LastName") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 
<asp:TemplateField HeaderText="Age"> 
    <EditItemTemplate> 
     <asp:TextBox ID="Age" runat="server" Text='<%# Bind("Age") %>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label2" runat="server" Text='<%# Bind("Age") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

В вашем методе "grdPlayer_RowUpdating", добавьте это:

int index = grdPlayer.EditIndex; 

GridViewRow row = grdPlayer.Rows[index]; 
Int64 ID = (Int64)grdPlayer.DataKeys[index].Value; 

TextBox FirstName = (TextBox)row.FindControl("FName"); 
TextBox Lastname = (TextBox)row.FindControl("LName"); 
TextBox Age = (TextBox)row.FindControl("Age"); 

e.NewValues["FirstName"] = FirstName.Text; 
e.NewValues["LastName"] = Lastname.Text; 
e.NewValues["Age"] = Age.Text; 

Я надеюсь, что это помогает.

Смежные вопросы