2015-08-18 45 views
1

我的GridView正在從綁定到它的select語句中獲取其數據。在GridView行中動態設置只讀文本框的簡單方法?

我想使所有列/行爲只讀/不可選,直到用戶單擊Edit按鈕。

Edit按鈕勢必GridView1_RowEditing

protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) 
     {    
      GridView1.EditIndex = e.NewEditIndex; 
      TextBox txtBoxResTitle = (TextBox)GridView1.Rows[GridView1.EditIndex].FindControl("txtBoxResTitle"); 
      txtBoxResTitle.ReadOnly = false; 
      txtBoxResTitle.Enabled = true; 
      BindData(); 
     } 

在我使用類EditIndexGridView讓剛由NewEditIndex設定的行的索引上面的代碼片段。在上面的代碼中,我還嘗試設置e.NewEditIndex以獲取該行以查找TextBox,但後面的代碼似乎仍不適用。

本質上,當我單擊編輯時,我希望選定行中的文本框進行編輯,以便編輯,並且當我單擊UpdateCancel時,我打算讓該行變爲不可編輯。

上面的代碼不會在這兩種情況下發揮作用(我是否使用GridView1.EditIndex or e.NewEditIndex

下面是爲GridView我的網頁代碼。

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
     <asp:GridView runat="server" AutoGenerateColumns="false" ID="GridView1" AllowPaging="true" 

      ... styling snipped ... 

      OnRowEditing="GridView1_RowEditing" 
      OnRowUpdating="GridView1_RowUpdating" 
      OnPageIndexChanging="GridView1_PageIndexChanging" 
      OnRowCancelingEdit="GridView1_RowCancelingEdit" 
      OnRowDeleting="GridView1_RowDeleting"> 

      ... styling snipped ... 

      <Columns> 
       <asp:TemplateField HeaderText="pk1" Visible="false"> 
<ItemTemplate> 
<asp:Label ID="lblResPk1" runat="server" visible="false" Text='<%#Eval ("pk1")%>'></asp:Label> 
</ItemTemplate> 
</asp:TemplateField> 
       <asp:TemplateField HeaderText="Resource Title"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtBoxResTitle" readonly="true" Enabled="false" runat="server" Text='<%#Eval ("resource_title")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Resource Type"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtBoxResType" runat="server" Text='<%#Eval ("resource_type")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Cost"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtBoxResCost" runat="server" Text='<%#Eval ("resource_cost")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Availability"> 
        <ItemTemplate> 
         <asp:TextBox ID="txtBoxResAvail" runat="server" Text='<%#Eval ("available")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Edit" ShowHeader="false"> 
<EditItemTemplate> 
<asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" CommandName="Update"></asp:LinkButton> 
<asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" CommandName="Cancel"></asp:LinkButton> 
</EditItemTemplate> 
<ItemTemplate> 
<asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" Text="Edit"></asp:LinkButton> 
</ItemTemplate> 
</asp:TemplateField> 
<asp:CommandField HeaderText="Delete" ShowDeleteButton="true" ShowHeader="true" /> 
<asp:CommandField HeaderText="Select" ShowSelectButton="true" ShowHeader="true" /> 
      </Columns> 

     </asp:GridView> 
      <asp:Label ID="lblDeleteException" runat="server" Text="Label" Font-Bold="True" ForeColor="#FF3300" Visible="False"></asp:Label> 
      </ContentTemplate> 
    </asp:UpdatePanel> 

請指教。

底部jQuery代碼

$(function() { 
$('#GridView1').find('[input type="text"]').each(function() { 
    $(this).attr('disabled', 'disabled'); 
}) <-------extra) needed 
    }); 

被扔關於預期的錯誤),我相信它需要一個以上的地方譜寫。

我說我的更新面板的結束標記中的代碼右側像這樣:

</asp:UpdatePanel> 
    <script> 
     $(function() { 
      $('#GridView1').find('[input type="text"]').each(function() { 
       $(this).attr('disabled', 'disabled'); 
      }) 
     }); 
    </script> 
    </asp:Content> 

不過還是字段可編輯。我的Site.Master文件包含加載jquery文件的腳本引用,因爲我在我的項目的其他地方使用jQuery。

回答

2

在此事件中爲每行找到每個文本框並進行只讀操作。

protected void GridView1_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    foreach (Control ctrl in e.Row.Controls) 
    { 
     MakeTextboxesReadonly(ctrl); 
    } 

} 

private static void MakeTextboxesReadonly(Control parent) 
{ 
    foreach (Control ctrl in parent.Controls) 
    { 
     if (ctrl is TextBox) 
     { 
      (ctrl as TextBox).Enabled = false; 
     } 
    } 
} 
+0

在我的HTML我需要添加OnRowCreated =「GridView1_RowCreated」對不對?如何循環瀏覽每個Ctrl以提高效率/頁面加載時間?看起來好像它不是最佳的。 –

+0

這初步不適合我。是否因爲我使用SqlDataAdapter將數據綁定到gridview? onRowCreated事件正在觸發,但當它到達「if(ctrl是TextBox)」時,它不接受該條件爲真。 –

+0

如果您調用GridView1.DataSource =「您的數據源」,然後調用GridView1.DataBind(),則此事件正在觸發。什麼是不正確的工作。你可以使用JQuery嗎? – thewisegod