2016-11-18 53 views
0

我有一個ASP.NET的DataGrid在它幾行。我希望某些行是可編輯的,但不是全部(基於該行中的特定數據項)。的Datagrid條件的行編輯

本來,我是用ButtonColumn這樣做,但我不能把這一或關閉特定行。

這是我現在有:背後

<asp:DataGrid ID="grid1" runat="server" AutoGenerateColumns="false" EnableViewState="true" CssClass="GridviewControlStyle" CellSpacing="0" CellPadding="4" HeaderStyle-CssClass="HeaderStyle" 
    OnEditCommand="grid1_EditCommand" OnUpdateCommand="grid1_UpdateCommand" OnCancelCommand="grid1_CancelCommand" OnItemDataBound="grid1d_ItemDataBound"> 
    <Columns> 
     <asp:TemplateColumn> 
      <HeaderTemplate> 
       <strong><%# Resources.Status %></strong> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <%# DataBinder.Eval(Container, "DataItem.STATUS") %> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
     <asp:TemplateColumn> 
      <HeaderTemplate> 
       <strong><%# Resources.Amount %></strong> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <%# DataBinder.Eval(Container, "DataItem.AMT") %> 
      </ItemTemplate> 
      <EditItemTemplate> 
       <asp:CustomValidator ID="cvAmountGrid" OnServerValidate="cvAmountGrid_ServerValidate" Display="None" runat="server" ControlToValidate="txtAmount" /> 
       <asp:TextBox ID="txtAmount" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.AMT") %>' CssClass="small" /> 
      </EditItemTemplate> 
     </asp:TemplateColumn> 
     <asp:TemplateColumn> 
      <ItemTemplate> 
       <asp:Button runat="server" Text="Edit" ID="btnEdit" Visible='<%# IsRowEditable(Eval("STATUS").ToString()) %>' CommandName="Edit" /> 
       <asp:Button runat="server" Text="Update" ID="btnUpdate" Visible="false" CommandName="Update" /> 
       <asp:Button runat="server" Text="Cancel" ID="btnCancel" Visible="false" CommandName="Cancel" /> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
</asp:DataGrid> 

代碼:

public bool IsRowEditable(string status) 
{ 
    return !status.Equals("Locked", StringComparison.OrdinalIgnoreCase); 
} 

protected void grid1_EditCommand(object source, DataGridCommandEventArgs e) 
{ 
    grid1.EditItemIndex = e.Item.ItemIndex; 

    grid1.DataBind(); 

    TextBox t = e.Item.FindControl("txtAmount") as TextBox; 

    t.Visible = true; //this can't be found 

    Button b = e.Item.FindControl("btnEdit") as Button; 

    b.Visible = false; 

    Button u = e.Item.FindControl("btnUpdate") as Button; 

    u.Visible = true; 

    Button c = e.Item.FindControl("btnCancel") as Button; 

    c.Visible = true;  
} 

有我碰到的這種方法的幾個問題。首先,調用DataBind似乎重置了我在任何按鈕上設置的可見性狀態。如果我沒有數據綁定,那麼我的可編輯列不會顯示爲可編輯。所以,我嘗試將文本框設置爲可手動編輯;但findcontrol返回null,所以我不能。我在這裏做錯了什麼?

回答

0

好吧,我想出了一個更好的方式來做到這一點。我在下面給我的標記代碼爲所有三個按鈕:

Visible='<%# IsRowEditing(Container.ItemIndex) %>' 

在背後說我的代碼,我檢查,看看是否是當前正在編輯的行,使用的控制按鈕的可見性:

protected bool IsRowEditing(int index) 
{ 
    return index > 0 && index == grid1.EditItemIndex; 
} 

這個固定我的所有問題,比什麼,我試圖做以前簡單得多。數據綁定也適用於這種方法。

1

另一種方式來實現這一目標;

  • 那裏我刪除了數據驗證和列名數據綁定器,以避免 的複雜性。你可以在下面嘗試。
  • 更新和取消按鈕EditItemTemplate模板下,使他們將出現在編輯的事件。

.ASPX

<asp:DataGrid ID="grid1" runat="server" AutoGenerateColumns="false" EnableViewState="true" CssClass="GridviewControlStyle" CellSpacing="0" CellPadding="4" HeaderStyle-CssClass="HeaderStyle" 
OnEditCommand="grid1_EditCommand" OnUpdateCommand="grid1_UpdateCommand" OnCancelCommand="grid1_CancelCommand" OnItemDataBound="grid1d_ItemDataBound"> 
<Columns> 
    <asp:TemplateColumn> 
     <HeaderTemplate> 
      <strong>Status</strong> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <%# DataBinder.Eval(Container, "DataItem.STATUS") %> 
     </ItemTemplate> 
    </asp:TemplateColumn> 
    <asp:TemplateColumn> 
     <HeaderTemplate> 
      <strong>Amount</strong> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <%# DataBinder.Eval(Container, "DataItem.AMT") %> 
     </ItemTemplate> 
    <EditItemTemplate> 
      <asp:TextBox ID="txtAmount" runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.AMT") %>' CssClass="small" ReadOnly="false"/> 
     </EditItemTemplate> 
    </asp:TemplateColumn> 


    <asp:TemplateColumn> 
     <ItemTemplate> 
      <asp:Button runat="server" Text="Edit" ID="btnEdit" Visible='<%# IsRowEditable(Eval("STATUS").ToString()) %>' CommandName="Edit" /> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:Button runat="server" Text="Update" ID="btnUpdate" CommandName="Update" /> 
      <asp:Button runat="server" Text="Cancel" ID="btnCancel" CommandName="Cancel" /> 
     </EditItemTemplate> 
    </asp:TemplateColumn> 
    </Columns> 

代碼隱藏

  • 有你沒有手動設置的知名度。 EditItemTemplate將在編輯事件中處理它,當用戶單擊取消或更新時,編輯模板將被替換爲視圖。
  • 我使用了一些數據項的硬編碼列表,您可以用實際的數據源替換它並嘗試。

    List<DataItem> t; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
         LoadData(); 
        } 
    } 
    
    private void LoadData() 
    { 
        t = new List<DataItem>(); 
        DataItem t1 = new DataItem() { AMT = 5, STATUS = "LOCKED" }; 
        DataItem t2 = new DataItem() { AMT = 15, STATUS = "OPEN" }; 
        DataItem t3 = new DataItem() { AMT = 25, STATUS = "OPEN" }; 
        DataItem t4 = new DataItem() { AMT = 35, STATUS = "LOCKED" }; 
        t.Add(t1); 
        t.Add(t2); 
        t.Add(t3); 
        t.Add(t4); 
        grid1.DataSource = t; 
        grid1.DataBind(); 
    } 
    
    
    
    protected void grid1_UpdateCommand(object sender, DataGridCommandEventArgs e) 
    { 
        string newAmount = (e.Item.Cells[1].FindControl("txtAmount") as TextBox).Text; 
    
        //Update the data source with edited data 
    
        grid1.EditItemIndex = -1; 
    
        //Load Data with updated data 
        LoadData(); 
    
    } 
    
    protected void grid1_CancelCommand(object sender, DataGridCommandEventArgs e) 
    { 
        grid1.EditItemIndex = -1; //Bring back the previous state 
        LoadData(); 
    } 
    
    
    public bool IsRowEditable(string status) 
    { 
        return !status.Equals("Locked", StringComparison.OrdinalIgnoreCase); 
    } 
    
    protected void grid1_EditCommand(object source, DataGridCommandEventArgs e) 
    { 
        grid1.EditItemIndex = e.Item.ItemIndex; 
        LoadData(); 
    } 
    
    protected void grid1d_ItemDataBound(object sender, DataGridItemEventArgs e) 
    { 
    
    } 
    

DataItem.cs

public class DataItem 
{ 
    public int AMT { get; set; } 
    public string STATUS { get; set; } 
}