Проблемы связывания с GridView в ASP.NET - PullRequest
0 голосов
/ 08 марта 2012

Я полностью сбит с толку тем, как работает связывание ASP.NET GridView.

У меня есть GridView. Теперь на странице загрузки (используя !IsPostBack) я связываю GridView.

У моего gridview есть кнопка редактирования. Когда я нажимаю на него, GridView становится пустым. Поведение можно ожидать, потому что, когда я нажимаю на кнопку редактирования, происходит обратная передача и, поскольку я связал GridView внутри условия !IsPostback, он не будет связывать GridView.

Теперь, если я удаляю привязку GridView и помещаю ее вне условия !IsPostback, кнопка редактирования работает. Но я не могу получить отредактированное значение из TextBox. В этом случае также можно ожидать поведения, например, когда нажата кнопка обновления, GridView повторно связывается, поскольку привязка на этот раз была выполнена вне условия !IsPostback.

Итак, я хочу знать, какой может быть правильный код для кнопки редактирования, и в то же время можно получить отредактированные значения из TextBox.

Вопрос обновлен кодом:

<asp:GridView ID="grdExternalLinkSection1" ShowFooter="true" runat="server" Width="100%" AutoGenerateColumns="false" CellPadding="5" EnableViewState="true">
                                <EmptyDataTemplate>
                                    External Link Title
                                    <asp:TextBox ID="txtExternalLinkTitleEmptySection1" runat="server"></asp:TextBox>
                                    External Link Url
                                    <asp:TextBox ID="txtExternalLinkUrlEmptySection1" runat="server"></asp:TextBox>
                                    <asp:Button ID="btnExternalLinkEmptySection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" Text="Add" CommandName="headernew,1" style="padding:3px; width:56px;" />
                                </EmptyDataTemplate>
                                <Columns>
                                    <asp:TemplateField HeaderText="Title">
                                        <ItemTemplate>
                                            <asp:Label ID="lblExternalLinkTitleSection1" runat="server"><%# Eval("Title") %></asp:Label>
                                        </ItemTemplate>
                                        <EditItemTemplate>
                                            <asp:TextBox ID="txtExternalLinkTitleEditSection1" runat="server" Text='<%# Bind("Title") %>'></asp:TextBox>
                                        </EditItemTemplate>
                                        <FooterTemplate>
                                            <asp:TextBox ID="txtExternalLinkTitleFooterSection1" runat="server"></asp:TextBox>
                                        </FooterTemplate>
                                    </asp:TemplateField>
                                    <asp:TemplateField HeaderText="Url">
                                        <ItemTemplate>
                                            <asp:Label ID="lblExternalLinkUrlSection1" runat="server"><%# Eval("Url")%></asp:Label>
                                        </ItemTemplate>
                                        <EditItemTemplate>
                                            <asp:TextBox ID="txtExternalLinkUrlEditSection1" runat="server" Text='<%# Bind("Url") %>'></asp:TextBox>
                                        </EditItemTemplate>
                                        <FooterTemplate>
                                            <asp:TextBox ID="txtExternalLinkUrlFooterSection1" runat="server"></asp:TextBox>
                                        </FooterTemplate>
                                    </asp:TemplateField>

                                    <asp:TemplateField HeaderText="Manage">
                                        <ItemTemplate>
                                            <asp:Button ID="btnExternalLinkEditSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Editing,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Edit" />
                                            <asp:Button ID="btnExternalLinkDeleteSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Deleting,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Delete" />
                                        </ItemTemplate>
                                        <EditItemTemplate>
                                            <asp:Button ID="btnExternalLinkUpdateSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Updating,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Update" />
                                            <asp:Button ID="btnExternalLinkCancelSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Canceling,1" CommandArgument='<%# Container.DataItemIndex %>' Text="Cancel" />
                                        </EditItemTemplate>
                                        <FooterTemplate>
                                            <asp:Button ID="btnExternalLinkAddFooterSection1" OnCommand="grdExternalLinkSection_Button_Clicks" runat="server" CommandName="Footer,1" Text="Add" />
                                        </FooterTemplate>
                                    </asp:TemplateField>
                                </Columns>
                            </asp:GridView>

ниже - функция, которая выполняет привязку:

 GridView grid;
    protected void BindExternalLinks(int SectionID, string ControlName)
    {
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            using (SqlDataAdapter adapter = new SqlDataAdapter("user_Newsletter_GetExternalLinks", connection))
            {
                adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
                adapter.SelectCommand.Parameters.Add("@SectionID", SqlDbType.Int).Value = SectionID;
                adapter.SelectCommand.Parameters.Add("@PortalID", SqlDbType.Int).Value = PortalID;
                DataTable dt = new DataTable();
                adapter.Fill(dt);
                grid = (GridView)this.FindControl(ControlName);
                grid.DataSource = dt;
            }
        }
    }
    protected void BindAllExternalLinks()
    {
        for (int i = 1; i <= NewsLetterSectionCount; i++)
        {
            BindExternalLinks(i, "grdExternalLinkSection" + i);
            grid.DataBind();
        }
    }

ниже мой PageLoad:

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

и ниже мое событие командных кнопок: я сохранил общий обработчик для всех командных кнопок:

   protected void grdExternalLinkSection_Button_Clicks(object sender, CommandEventArgs e)
    {
        int rowIndex = (e.CommandArgument != "") ? Convert.ToInt32(e.CommandArgument) : -1;
        string[] commandNames = e.CommandName.ToString().Split(',');
        string command = commandNames[0].ToString().ToLower();
        int sectionID = Convert.ToInt32(commandNames[1]);
        GridView grid = (GridView)this.FindControl("grdExternalLinkSection" + sectionID);
        try
        {
            if (command == "headernew")
            {
                TextBox title = grid.Controls[0].Controls[0].FindControl("txtExternalLinkTitleEmptySection" + sectionID) as TextBox;
                TextBox url = grid.Controls[0].Controls[0].FindControl("txtExternalLinkUrlEmptySection" + sectionID) as TextBox;
                UpdateExternalLinks(ModifyExternalLinks.Insert, sectionID, title.Text, url.Text);
                MessageShow("External Link Added Successfully");
            }
            else if (command == "editing")
            {
                //grid.EditIndex = rowIndex;
            }
            else if (command == "canceling")
            {
                grid.EditIndex = -1;
            }
            else if (command == "footer")
            {
                Response.Write("Inside Footer");
            }
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
        BindExternalLinks(sectionID, "grdExternalLinkSection" + sectionID);
        grid.DataBind(); //here i am binding once the records are modified.
    }

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы почти у цели.BindAllExternalLinks() должно быть внутри блока if (!IsPostback), правильно.

Еще одна вещь, которую вы должны сделать, это перепривязать сетку после того, как вы закончили редактирование:

else if (command == "editing")
{
    // do your update stuff here

    BindAllExternalLinks();
}
0 голосов
/ 08 марта 2012

Просто перепривязать сетку под каждым событием обратной передачи ().Даже если вы привязываете его к объектному источнику данных или источнику данных SQL, вы должны вызывать метод привязки данных после каждого запроса обратной передачи, например

              MyGridview.DataBind();
              UpdatePanel1.Update();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...