Mam kontrolę nad formview. Wewnątrz kontrolki formview jest to jeden widok siatki. W widoku siatki mam FooterTemplate (w footertemplate mam kontrolę pola tekstowego, aby dodać tekst), aby dodać tekst. Aby znaleźć tę kontrolę, napisałem kod w następujący sposób:

 GridView mygridview = (GridView)FVAddCustomer.FindControl("mygridview");
TextBox txtFName1 = (TextBox)mygridview.FooterRow.FindControl("txtFName1");

Czy to prawda czy w jakikolwiek inny sposób? ponieważ kiedy znajdę wartość pola tekstowego, to się null? Proszę pomóż mi?

  <asp:GridView ID="mygridview" runat="server" AutoGenerateColumns="False" ShowFooter="True" BackColor="White" BorderColor="#336666" BorderWidth="3px" CellPadding="4" GridLines="Horizontal" BorderStyle="Double" Width="100%" OnRowEditing="mygridview_RowEditing" OnRowCancelingEdit="mygridview_RowCancelingEdit" OnRowUpdating="mygridview_RowUpdating" Visible="false">
       <FooterStyle BackColor="White" ForeColor="#333333" />
       <PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />
       <SelectedRowStyle BackColor="#339966" ForeColor="White" Font-Bold="True" />
       <HeaderStyle BackColor="#336666" Font-Bold="True" ForeColor="White" />
       <Columns>
          <asp:TemplateField HeaderText="First Name">
             <ItemTemplate>
                 <asp:Label ID="lblFName1" runat="server" Text='<%#Eval("FirstName")%>'></asp:Label>
             </ItemTemplate>
             <EditItemTemplate>
                  <asp:TextBox ID="txtFName1Edit" runat="server" Width="90px"></asp:TextBox>
            </EditItemTemplate>
            <FooterTemplate>
               <asp:TextBox ID="txtFName1" runat="server" Width="90px"></asp:TextBox>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Edit">
            <ItemTemplate>
               <asp:LinkButton ID="lnkEdit" runat="server" Text="Edit" CommandName="Edit" CausesValidation="false" OnClick="lnkEdit_Click"></asp:LinkButton>
            </ItemTemplate>
            <EditItemTemplate>
              <asp:LinkButton ID="lnkUpdate" runat="server" Text="Update" CommandName="Update"></asp:LinkButton>
              <asp:LinkButton ID="lnkCancel" runat="server" Text="cancel" CommandName="Cancel"></asp:LinkButton>
            </EditItemTemplate>
            <FooterTemplate>
                <asp:LinkButton ID="lnkAdd" runat="server" Text="Add" CommandName="Add" Width="90px" OnClick="lnkAdd_Click"></asp:LinkButton>
            </FooterTemplate>
         </asp:TemplateField>

Dziękuję Ci. Asp.net C#

1
abc 9 sierpień 2011, 11:34
Gdzie nazywasz ten kod? Czy wcześniej wywołałeś FormView.DataBind/GridView.DataBind?
 – 
Tim Schmelter
9 sierpień 2011, 11:57
Tak, zadzwoniłem do gridview.databind w ładowaniu strony
 – 
abc
9 sierpień 2011, 12:07
Nie odpowiedziałeś na moje pytanie, gdzie próbujesz uzyskać txtFName1. Pamiętaj również, że FormView ma 3 różne tryby FormViewModes. Jeśli jest obecnie w trybie edycji, a widok GridView znajduje się w ItemTemplate tylko do odczytu, nie możesz uzyskać do niego dostępu.
 – 
Tim Schmelter
9 sierpień 2011, 12:21
Nazwałem ten kod w zdarzeniu kliknięcia przycisku lnkadd, przycisk lnkadd znajduje się w widoku siatki (szablon stopki)
 – 
abc
9 sierpień 2011, 12:21
Dodałem gridview w insertitemtemplate, ale nawet jeśli dodam gridview poza formview, to również nie znajduje wartości pola tekstowego
 – 
abc
9 sierpień 2011, 12:24

2 odpowiedzi

Najlepsza odpowiedź

z komentarzy:

Czy wcześniej wywołałeś FormView.DataBind/GridView.DataBind?

Pamiętaj również, że FormView ma 3 różne tryby FormViewModes. Jeśli jest obecnie w trybie edycji, a widok GridView znajduje się w ItemTemplate tylko do odczytu, nie możesz uzyskać do niego dostępu.

Wypróbuj to, aby pobrać TextBox z modułu obsługi zdarzeń kliknięcia LinkButton:

private void lnkadd_Click(object sender, System.EventArgs e)
{
    var footer = (GridViewRow)((WebControl)sender).NamingContainer;
    var txtFName1 = (TextBox)footer.FindControl("footer");
}

Edycja: jeśli to nie zadziała, możesz spróbować obsłużyć GridView RowCommand:

protected void mygridview_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
{
    if (e.CommandName == "Add") {
        var txtFName1 = (TextBox)((GridView)sender).FooterRow.FindControl("txtFName1");
    }
}

Edycja2:

Powinieneś powiązać swój widok GridView z jego DataSource tylko wtedy, gdy !IsPostBack. Najlepszym miejscem do zrobienia tego jest zdarzenie DataBound w FormView:

protected void FormView1_DataBound(object sender, System.EventArgs e)
{
    switch (FormView1.CurrentMode) {
        case FormViewMode.Insert:
            var mygridview = (GridView)((FormView)sender).FindControl("mygridview");
            //Bind your GridView here'
            break;
    }
}

W ten sposób zapewniasz, że GridView zostanie automatycznie odtworzone, gdy FormView zostanie powiązana z danymi. Jeśli FormView zmieni swój tryb na Insert, musisz DataBind go, nawet jeśli DataSource to null!

0
Tim Schmelter 9 sierpień 2011, 14:16
Użyłem tego kodu, ale wartość txtFName1 otrzymała wartość null (nie można znaleźć txtFName1)
 – 
abc
9 sierpień 2011, 12:37
Zamieściłem mój znacznik w moim pytaniu, zobacz go i zasugeruj wprowadzenie zmian
 – 
abc
9 sierpień 2011, 12:53
@abc: spróbuj użyć RowCommand (zobacz moją edycję). Czy wiążesz GridView nawet w przypadku ogłaszania zwrotnego z page_load?
 – 
Tim Schmelter
9 sierpień 2011, 13:08
Dodałem zdarzenie rowcommand, wtedy również nie działa, wiążę gridview w ładowaniu strony, nie używałem if (! ispostback)
 – 
abc
9 sierpień 2011, 13:34
@abc: Sprawdź, czy !IsPostBack. W przeciwnym razie wartość TextBox byłaby pusta, nawet jeśli użytkownik coś wprowadził. Ale to nie może wyjaśnić twojego problemu ze znalezieniem TextBox .
 – 
Tim Schmelter
9 sierpień 2011, 13:41

Zauważyłem, że moja siatka powinna być wypełniona tylko wtedy, gdy (!IsPostback) wystąpi w zdarzeniu pageLoad. Lubię to:

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

A następnie wykonałem operację wstawiania, która się powiodła

protected void CustomerGridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
        bool flag = false;
        if (e.CommandName.Equals("Insert")) 
        {
            TextBox txtNewName = (TextBox)CustomerGridview.FooterRow.FindControl("txtNewName");                
            DropDownList ddlNewGender = (DropDownList)CustomerGridview.FooterRow.FindControl("ddlNewGender");
            DropDownList ddlNewType = (DropDownList)CustomerGridview.FooterRow.FindControl("cmbNewType");
            CheckBox chkNewActive = (CheckBox)CustomerGridview.FooterRow.FindControl("chkNewActive");
            if (chkNewActive.Checked) flag = true;
            else
                flag = false;
            SqlConnection con = new SqlConnection(conection);
            con.Open();
            SqlCommand command = con.CreateCommand();
            SqlTransaction transaction;
            // Start a local transaction.
            transaction = con.BeginTransaction();
            // Must assign both transaction object and connection 
            // to Command object for a pending local transaction
            command.Connection = con;
            command.Transaction = transaction;

            try
            {
                command.CommandText = "Insert into Contact (Name,Sex,Type,IsActive) values('" + txtNewName.Text + "','" + ddlNewGender.SelectedValue.ToString() + "','" + ddlNewType.SelectedValue.ToString() + "','" + flag + "')";
                command.ExecuteNonQuery();
                transaction.Commit();
                Message.Text = "Record has been saved!!";
            }
            catch (Exception ex)
            {
                Message.Text = "Error Occured!!";
                try
                {
                    transaction.Rollback();
                }
                catch(Exception ex2)
                {
                    Message.Text = "Transaction RollBack!";
                }
            }   
            FillGrid();
        }
    }
0
ChrisF 6 marzec 2014, 16:51