2013-06-04 34 views
0

我想使用下面的代碼禁用特定的grdview行,但它不禁用該行。我100%肯定在綁定到gridview的列中有一個名爲「Total Expenses」的值。更奇怪的是,我刪除了if條件(accountTextBox.Text ==「Total Expenses」),以查看是否所有行都被禁用,但只有第一行被禁用。對此有何想法?GridView行將不會禁用

更多信息:我正在使用gridview和模板字段(ASP.NET,C#)。我也運行調試器,發現accountTextBox顯示NULL。我感到困惑!

我很欣賞你的想法。謝謝

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
     if (!tableCopied) 
     { 
      originalDataTable = ((System.Data.DataRowView)e.Row.DataItem).Row.Table.Copy(); 
      ViewState["originalValuesDataTable"] = originalDataTable; 
      tableCopied = true; 
      TextBox accountTextBox = (TextBox)e.Row.FindControl("AccountTextBox"); 

       if (accountTextBox.Text == "Total Expenses") 
       { 
        e.Row.Enabled = false; 
       } 

     } 
} 
+0

tableCopied被設置在哪裏?潛在的價值不會通過PostBacks持續存在。 –

+0

由於警備,以下行是右邊的代碼塊I之前貼以上:'公共部分類_Default:System.Web.UI.Page { 保護無效的Page_Load(對象發件人,EventArgs的) { } private bool tableCopied = false; private System.Data.DataTable originalDataTable;' – sam

+0

你可以發佈模板標記 – fnostro

回答

0

tableCopied變量可能是問題。它將在第一行設置爲true,這將限制剩餘行進入if條件並實際被禁用。

First row: 
    //tableCopied is false 
    if(!tableCopied) // pass 
     tableCopied = true 

Other rows: 
    //tableCopied is true 
    if(!tableCopied) // wont pass 

注意,GridView1_RowDataBound事件在相同的回傳,每類成員的每一行都出現一次回傳過程中依然存在。

0

使用下面的代碼隱藏:

public partial class _Default : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      gvTest.DataSource = new List<string>() { "test1", "test2" }; 
      gvTest.DataBind(); 
     } 

     private bool tableCopied = false; 
     private System.Data.DataTable originalDataTable; 

     protected void gvTest_RowDataBound(object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
       if (!tableCopied) 
       { 
        //originalDataTable = ((System.Data.DataRowView)e.Row.DataItem).Row.Table.Copy(); 
        //ViewState["originalValuesDataTable"] = originalDataTable; 
        //tableCopied = true; 
        TextBox accountTextBox = (TextBox)e.Row.FindControl("AccountTextBox"); 

        if (accountTextBox.Text == "Total Expenses") 
        { 
         e.Row.Enabled = false; 
        } 

       } 
     } 
    } 

而這個標記:

<asp:GridView runat="server" ID="gvTest" OnRowDataBound="gvTest_RowDataBound"> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:TextBox ID="AccountTextBox" runat="server">Total Expenses</asp:TextBox> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

我不再現錯誤。兩行都禁用了我。

+1

要檢查的東西 - 如果他實際上放置了一個文本框在模板標記ItemTemplate - 這是一回事。如果他將綁定字段轉換爲模板,我相信它會在ItemTemplate中放置一個標籤,並在EditTemplate中放置一個文本框。我可能是錯的,但我不認爲你會去找到文本框,除非Gridview處於編輯模式,這就是爲什麼我想看到他的標記。 – fnostro

+0

非常感謝,所有的建議工作。很高興能成爲這個社區的一部分。希望我會盡快開始回報:)我不打包標記您的帖子作爲答案,版主,您可以請幫忙嗎? – sam

+0

沒關係 - 當你發表評論時,我正在發表自己的想法 - 很高興我們都把你放在了正確的方向。 – fnostro

1

我假設您的標記看起來是這樣的:

<asp:TemplateField HeaderText="SomeField" SortExpression="SomeField"> 
    <EditItemTemplate> 
     <asp:TextBox ID="AccountTextBox" runat="server" Text='<%# Bind("SomeField") %>'></asp:TextBox> 
    </EditItemTemplate> 
    <ItemTemplate> 
     <asp:Label ID="Label1" runat="server" Text='<%# Bind("SomeField") %>'></asp:Label> 
    </ItemTemplate> 
</asp:TemplateField> 

在這種情況下,AccountTextBox將只提供的RowDataBound時e.Row.State處於編輯模式。根據您的數據源提供的更新功能,這可能會也可能不可用,但這是別的。

通常情況下,您不使用文本框來顯示數據,但可以說試圖填充「只讀」文本框,然後所有你需要做的就是將AccountTextBox從EditTemplate移動到ItemTemplate,你應該很好去。

+0

這是一個有效的點,但是如果是這樣的話,那麼他的檢查'accountTextBox.Text'值的代碼會拋出一個空引用異常。 –

+1

是的。雖然他沒有明確說出,但他確實聲明'accountTextBox'的值爲null ...結論? – fnostro

+0

誇大了你 - 完全忘了他提到null。 –