2016-02-06 22 views
0

我已經嘗試了幾個所謂的答案,這讓我失去了。我只是試圖默認TextBox文本值與今天的日期和時間,但我找不到控制,當我點擊LinkButton CommandName「編輯」。如何在GridViewRow編輯模式下找到TextBox

這裏是我的gridview的...

<asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" 
     DataSourceID="sdsSignInRegister" ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" GridLines="Vertical" OnRowCommand="gvSignInRegister_RowCommand1"> 
     <Columns> 
      <asp:TemplateField HeaderText="Returned" SortExpression="DateTimeReturned"> 
       <EditItemTemplate> 
        <asp:TextBox ID="txtReturned" runat="server"></asp:TextBox> 
        <asp:ImageButton runat="Server" ID="calImg" ImageUrl="~/images/Calendar_scheduleHS.png" AlternateText="Click to show calendar" CausesValidation="False" /> 
        <asp:RequiredFieldValidator ID="rfv1" runat="server" SetFocusOnError="true" ValidationGroup="vg1" ControlToValidate="txtReturned" ErrorMessage="Required"></asp:RequiredFieldValidator> 
        <ajaxToolkit:CalendarExtender ID="ce1" runat="server" PopupButtonID="calImg" Enabled="true" Format="dd/MM/yyyy" TargetControlID="txtReturned" PopupPosition="TopRight" OnClientDateSelectionChanged="AppendTime"></ajaxToolkit:CalendarExtender> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Label ID="Label9" runat="server" Text='<%# Eval("DateTimeReturned","{0:dd/MM/yyyy HH:mm}") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:TemplateField ShowHeader="False"> 
       <EditItemTemplate> 
        <asp:Button ID="btnCAN" runat="server" CausesValidation="false" CommandName="Cancel" Text="CANCEL" /> 
        <asp:Button ID="btnUPD" runat="server" ValidationGroup="vg1" CausesValidation="true" CommandName="Update" Text="UPDATE" /> 
       </EditItemTemplate> 
       <ItemTemplate> 
        <asp:Button ID="btnEDT" runat="server" CausesValidation="false" CommandName="Edit" CommandArgument='<%# Container.DataItemIndex %>' Text="SIGN IN" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
     <FooterStyle BackColor="#CCCCCC" /> 
     <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" /> 
     <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" /> 
     <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" /> 
     <AlternatingRowStyle BackColor="#CCCCCC" /> 
    </asp:GridView> 

LinkBut​​ton的btnEDT工作,並把GridView的編輯模式。但在後面的代碼中,我找不到「txtReturned」。

這是我到目前爲止已經試過......

protected void gvSignInRegister_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "Edit") 
    { 
     int rowIdx = Convert.ToInt32(e.CommandArgument); 
     GridViewRow row = gvSignInRegister.Rows[rowIdx]; 
     if (row != null && row.RowType == DataControlRowType.DataRow) 
     { 
      TextBox tb = (TextBox)row.FindControl("txtReturned"); 
      if (tb != null) tb.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm"); 

      //I've tried this too but it does not work. Interestingly, it does not crash, so cells[4] must exist! 
      //row.Cells[4].Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm"); 
     } 
    } 
} 

出於某種原因,rowIdx始終爲0,爲什麼?我認爲0的行索引意味着gridview控件的標題。

我也嘗試過使用其他人在其他帖子中提出的NamingContainer,但是返回一個空白(我懷疑是新的?)GridViewRow。

GridViewRow行=(GridViewRow)((GridViewRow)(e.CommandSource).NamingContainer);

UPDATE

我發現this,而這正是我所遇到的問題,而是通過RowEditing解決方案仍然找不到文本框!

但是RowDataBound()解決了它!閱讀下面的答案。

回答

0

答案是在進入GridView控件本身的編輯模式版本,然後找到控制!

按照this post ...

<asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3" 
      DataSourceID="sdsSignInRegister" ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" GridLines="Vertical" OnRowDataBound="gvSignInRegister_RowDataBound"> 
      <Columns> ...etc... 


protected void gvSignInRegister_RowDataBound(object sender, GridViewRowEventArgs e) 
       { 
        if (e.Row.RowType == DataControlRowType.DataRow) 
        { 
         if ((e.Row.RowState & DataControlRowState.Edit) > 0) 
         { 
          TextBox tb = (TextBox)e.Row.FindControl("txtReturned"); 
          if (tb != null) tb.Text = DateTime.Now.ToString("dd/MM/yyyy HH:mm"); 
         } 
        } 
       } 
1

使用Container.DisplayIndex而不是Container.DataItemIndex

但我不認爲你會得到TextBox控件,如果你把它放在EditItemTemplate中

如果你的期望是編輯操作,那麼請使用下面的代碼

HTML

<asp:GridView ID="gvSignInRegister" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" CellPadding="3"   ForeColor="Black" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" OnRowEditing="gvSignInRegister_RowEditing" OnRowCancelingEdit="gvSignInRegister_RowCancelingEdit" OnRowUpdating ="gvSignInRegister_RowUpdating" GridLines="Vertical"> 
      <Columns> 
       <asp:TemplateField HeaderText="Returned" SortExpression="DateTimeReturned"> 
        <EditItemTemplate> 
         <asp:TextBox ID="txtReturned" Text='<%#Bind("DateTimeReturned", "{0:dd/MM/yyyy HH:mm}")%>' runat="server"></asp:TextBox> 
         <asp:ImageButton runat="Server" ID="calImg" ImageUrl="~/images/Calendar_scheduleHS.png" AlternateText="Click to show calendar" CausesValidation="False" /> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:Label ID="Label9" runat="server" Text='<%# Eval("DateTimeReturned","{0:dd/MM/yyyy HH:mm}") %>'></asp:Label> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField ShowEditButton="true" /> 
      </Columns> 
      <FooterStyle BackColor="#CCCCCC" /> 
      <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" /> 
      <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" /> 
      <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" /> 
      <AlternatingRowStyle BackColor="#CCCCCC" /> 

     </asp:GridView> 

代碼背後:

protected void gvSignInRegister_RowEditing(object sender, GridViewEditEventArgs e) 
    { 
     gvSignInRegister.EditIndex = e.NewEditIndex; 
     List<QuotationDetail> itemList = (List<QuotationDetail>)ViewState["ItemList"]; 
     gvSignInRegister.DataSource = itemList; 
     gvSignInRegister.DataBind(); 
    } 

    protected void gvSignInRegister_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
    { 

    } 

    protected void gvSignInRegister_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     var txtQty = (TextBox)gvSignInRegister.Rows[e.RowIndex].FindControl("txtQuantity"); 
     decimal qty = 0; 
     decimal.TryParse(txtQty.Text, out qty); 

     if (qty < 0) 
     { 
      lblErrorSummary.InnerText = "Please provide valid Quantity"; 
      lblErrorSummary.Visible = true; 
      return; 
     } 
     itemList[e.RowIndex].Quantity = qty 
     ViewState["ItemList"] = itemList; 
     gvSignInRegister.EditIndex = -1; 
     gvSignInRegister.DataSource = itemList; 
     gvSignInRegister.DataBind(); 
    } 
+0

謝謝,但直到用戶提供了一個有效的日期/時間,我想在它之前默認爲今天的日期和時間反正我沒有啓動起來的GV更新他們點擊SUBMIT觸發RowUpdating。我剛剛嘗試使用RowEditing,因爲它處於編輯模式,是的,你是對的。我仍然無法找到文本框。這是爲什麼?你不能在gridview的編輯模式下找到控件嗎? – Fandango68

+1

是的,只有在editmode處於活動狀態後,EditItemTemplate中的控件纔可用。所以你不能在划船活動上得到它。這就是爲什麼我給了文本框控件的約束力。這會給你一個佔位符,以便在加載電網本身時取消當前日期。你可以在rowUpdating事件中執行validatin,如果validatin失敗,則返回false。 –

+0

但正如我所說,RowUpdating也沒有工作。 – Fandango68

相關問題