BebeSaiyan Ответов: 1

Как создать пользовательскую кнопку удаления и редактирования в gridview с помощью ASP.NET пт. 2?


Наконец я смог создать пользовательскую кнопку удаления и редактирования для своего gridview. Но я заметил две проблемы в моем gridview. Надеюсь, вы, ребята, поможете мне в этом деле. Кроме того, это только для практики. В ближайшее время я внедрю лучшую безопасность на своем сайте.

Проблема 1: Когда я нажимаю кнопку Удалить в первый раз, она просто обновляет страницу и ничего не делает. Но когда я нажимаю на него во второй раз, он работает идеально. Почему кнопка Удалить не работает и просто обновляет страницу при первом нажатии, а затем работает во второй раз?
Задача 2:Когда я нажимаю кнопку редактирования в первый раз, она работает нормально. Затем я могу обновить / изменить базу данных. Допустим, я хочу изменить имя «Дин» под идентификатором «7» на «Джексон». Поэтому я просто изменил его в текстовом поле и нажал кнопку обновления. Но веб-сайт просто обновляется снова, а имя «Дин» все еще находится в текстовом поле (кстати, оно все еще находится в режиме обновления / отмены). Так что мне нужно снова ввести «Джексон» в текстовое поле и второй раз нажать кнопку обновления. На этот раз он работает, и он обновил мою сетку. Подобно проблеме 1, почему кнопка обновления не работает и просто обновляет страницу при первом нажатии и работает во второй раз?

Что я уже пробовал:

Вот код aspx:
<h3>Guitar Brands Data:</h3>
    <div style="overflow:auto; width:1100px; max-height:500px;">
        <asp:GridView ID="GuitarBrandsGridView" runat="server" CssClass="mydatagrid" PagerStyle-CssClass="pager" HeaderStyle-CssClass="header" RowStyle-CssClass="rows" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="id" DataSourceID="SqlDataSource0" OnRowDataBound="GuitarBrandsGridView_RowDataBound" OnRowCancelingEdit="GuitarBrandsGridView_RowCancelingEdit" OnRowEditing="GuitarBrandsGridView_RowEditing" OnRowUpdating="GuitarBrandsGridView_RowUpdating"  OnRowDeleting="GuitarBrandsGridView_RowDeleting" Width="864px" Height="250px">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnDelete" runat="server" CommandName="Delete" Text="Delete"/>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnEdit" runat="server" CommandName="Edit" Text="Edit"/>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnUpdate" runat="server" CommandName="Update" Text="Update"/>
                        <asp:Button ID="GuitarBrandsGridViewBtnCancel" runat="server" CommandName="Cancel" Text="Cancel"/>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="id" SortExpression="id">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="type" SortExpression="type">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("type") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label3" runat="server" Text='<%# Bind("type") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="name" SortExpression="name">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("name") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label4" runat="server" Text='<%# Bind("name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="image" SortExpression="image">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("image") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label5" runat="server" Text='<%# Bind("image") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <HeaderStyle CssClass="header"></HeaderStyle>
            <PagerStyle CssClass="pager"></PagerStyle>
            <RowStyle CssClass="rows"></RowStyle>
        </asp:GridView>


Здесь это реализовано.CS коде :
protected void Page_Load(object sender, EventArgs e)
    {
        BindGridViewDataList.GetItemsLoad();
    }

    //Start of Gridview Code for Guitar Brands
    private void bindgridviewguitarbrands()
    {
        con1.Open();
        cmd1.CommandText = "SELECT * FROM [guitarBrands]";
        cmd1.Connection = con1;
        SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
        da1.Fill(ds1);
        con1.Close();
        GuitarBrandsGridView.DataBind();
    }

    protected void GuitarBrandsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string name = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Name"));
            Button button = (Button)e.Row.FindControl("GuitarBrandsGridViewBtnDelete");
            button.Attributes.Add("onclick", "JavaScript:return ConfirmationBox('" + name + "' )");
        }
    }

    protected void GuitarBrandsGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {

        int id = Convert.ToInt32(GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString());
        Label name = (Label)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("Label4");

        con1.Open();
        cmd1.CommandText = "DELETE FROM [guitarBrands] WHERE id=" + id;
        cmd1.Connection = con1;
        int a = cmd1.ExecuteNonQuery();
        con1.Close();
        if (a > 0)
        {
            bindgridviewguitarbrands();
        }

        RemoveCodeToGuitarFile.RemoveAddGuitarClass(name.Text);
        RemoveCodeToGuitarFile.RemoveConnectionClassGuitarItems(name.Text);
        RemoveCodeToGuitarFile.RemoveOverviewGuitarDataASPX(name.Text);
        RemoveCodeToGuitarFile.RemoveOverviewGuitarDataCode(name.Text);
        File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx");
        File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx.cs");
        ConnectionClassGuitarBrands.RemoveGuitarBrandsDatabase(name.Text);

    }

    protected void GuitarBrandsGridView_RowEditing(object sender, GridViewEditEventArgs e)
    {
        string id = GuitarBrandsGridView.DataKeys[e.NewEditIndex].Value.ToString();
        Label name = (Label)GuitarBrandsGridView.Rows[e.NewEditIndex].FindControl("Label4");

        RemoveCodeToGuitarFile.RemoveAddGuitarClass(name.Text);
        RemoveCodeToGuitarFile.RemoveConnectionClassGuitarItems(name.Text);
        RemoveCodeToGuitarFile.RemoveOverviewGuitarDataASPX(name.Text);
        RemoveCodeToGuitarFile.RemoveOverviewGuitarDataCode(name.Text);
        File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx");
        File.Delete(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\GuitarItems" + id + ".aspx.cs");
        ConnectionClassGuitarBrands.RemoveGuitarBrandsDatabase(name.Text);

        GuitarBrandsGridView.EditIndex = e.NewEditIndex;
        bindgridviewguitarbrands();
    }
    // row update event
    protected void GuitarBrandsGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        string id = GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString();
        TextBox type = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox1");
        TextBox name = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox2");
        TextBox image = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox3");

        cmd1 = new SqlCommand("UPDATE [guitarBrands] SET Type = '" + type + "', Name = '" + name + "', Image = '" + image + "' WHERE ID = " + id, con1);
        con1.Open();
        cmd1.ExecuteNonQuery();
        con1.Close();

        int ID = Convert.ToInt32(id);
        ConnectionClassGuitarBrands.CreateGuitarBrandsDatabase(name.Text);
        AddCodeToGuitarFile.AddGuitarClassCode(name.Text, ID);
        AddCodeToGuitarFile.AddConnectionClassGuitarItems(name.Text);
        AddCodeToGuitarFile.AddOverviewGuitarDataASPX(name.Text, ID);
        AddCodeToGuitarFile.AddOverviewGuitarDataASPXCode(name.Text);
        AddASPXAndCSFileForGuitarBrands.AddFile(name.Text, ID);

        GuitarBrandsGridView.EditIndex = -1;
        bindgridviewguitarbrands();  
    }
    // cancel row edit event
    protected void GuitarBrandsGridView_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        string id = GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString();
        TextBox name = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox2");

        int ID = Convert.ToInt32(id);
        ConnectionClassGuitarBrands.CreateGuitarBrandsDatabase(name.Text);
        AddCodeToGuitarFile.AddGuitarClassCode(name.Text, ID);
        AddCodeToGuitarFile.AddConnectionClassGuitarItems(name.Text);
        AddCodeToGuitarFile.AddOverviewGuitarDataASPX(name.Text, ID);
        AddCodeToGuitarFile.AddOverviewGuitarDataASPXCode(name.Text);
        AddASPXAndCSFileForGuitarBrands.AddFile(name.Text,ID);

        GuitarBrandsGridView.EditIndex = -1;
        bindgridviewguitarbrands();
    }

    //End of Gridview Code for Guitar Brands

1 Ответов

Рейтинг:
0

Karthik_Mahalingam

Добавь IsPostBack Состояние в Page_Load событие

protected void Page_Load(object sender, EventArgs e)
       {
           if (!Page.IsPostBack)
           {
               BindGridViewDataList.GetItemsLoad();
           }
       }


BebeSaiyan

я попробовал это сделать, но у него все еще была та же проблема. я ценю ваш ответ, Тхо.

Karthik_Mahalingam

редактировать или удалять?

BebeSaiyan

оба

Karthik_Mahalingam

GuitarBrandsGridView.Источник данных = ДС отсутствует.

BebeSaiyan

на самом деле я использую sqldatasource в моем gridview, поэтому GuitarBrandsGridView.DataSource = ds не будет работать. Я не включил его выше, потому что он слишком длинный.

Karthik_Mahalingam

удалили sqldatasource и добавили таблицу данных в качестве источника данных



<asp:GridView ID="GuitarBrandsGridView" runat="server" CssClass="mydatagrid" PagerStyle-CssClass="pager" HeaderStyle-CssClass="header" RowStyle-CssClass="rows" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="id"   OnRowDataBound="GuitarBrandsGridView_RowDataBound" OnRowCancelingEdit="GuitarBrandsGridView_RowCancelingEdit" OnRowEditing="GuitarBrandsGridView_RowEditing" OnRowUpdating="GuitarBrandsGridView_RowUpdating"  OnRowDeleting="GuitarBrandsGridView_RowDeleting" Width="864px" Height="250px">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnDelete" runat="server" CommandName="Delete" Text="Delete"/>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnEdit" runat="server" CommandName="Edit" Text="Edit"/>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:Button ID="GuitarBrandsGridViewBtnUpdate" runat="server" CommandName="Update" Text="Update"/>
                        <asp:Button ID="GuitarBrandsGridViewBtnCancel" runat="server" CommandName="Cancel" Text="Cancel"/>
                    </EditItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="id" SortExpression="id">
                    <EditItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Eval("id") %>'></asp:Label>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label2" runat="server" Text='<%# Bind("id") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
               
                <asp:TemplateField HeaderText="name" SortExpression="name">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("name") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label4" runat="server" Text='<%# Bind("name") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
               
            </Columns>
            <HeaderStyle CssClass="header"></HeaderStyle>
            <PagerStyle CssClass="pager"></PagerStyle>
            <RowStyle CssClass="rows"></RowStyle>
        </asp:GridView>

Karthik_Mahalingam

это то, что я пробовал, это работает круто

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("id");
                dt.Columns.Add("name");
                dt.Rows.Add(1, "aa");
                dt.Rows.Add(2, "bb");
                dt.Rows.Add(3, "cc");
                Session["dt"] = dt;
                bindgridviewguitarbrands();
            }
        }

        //Start of Gridview Code for Guitar Brands
        private void bindgridviewguitarbrands()
        {
           
            DataTable dt = (DataTable)Session["dt"];
            GuitarBrandsGridView.DataSource = dt;
            GuitarBrandsGridView.DataBind();


        }

        protected void GuitarBrandsGridView_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string name = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Name"));
                Button button = (Button)e.Row.FindControl("GuitarBrandsGridViewBtnDelete");
                button.Attributes.Add("onclick", "JavaScript:return ConfirmationBox('" + name + "' )");
            }
        }

        protected void GuitarBrandsGridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {

            int id = Convert.ToInt32(GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString());
            Label name = (Label)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("Label4");

            DataTable dt = (DataTable)Session["dt"];
           var row =  dt.Rows.OfType<DataRow>().First(k => k["id"].ToString() == id.ToString());
           dt.Rows.Remove(row);
           dt.AcceptChanges();
           Session["dt"] = dt;
           bindgridviewguitarbrands();

        }

        protected void GuitarBrandsGridView_RowEditing(object sender, GridViewEditEventArgs e)
        {
            string id = GuitarBrandsGridView.DataKeys[e.NewEditIndex].Value.ToString();
            Label name = (Label)GuitarBrandsGridView.Rows[e.NewEditIndex].FindControl("Label4");



            GuitarBrandsGridView.EditIndex = e.NewEditIndex;
            bindgridviewguitarbrands();
        }
        // row update event
        protected void GuitarBrandsGridView_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            string id = GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString(); 
             
            TextBox name = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox2");

            DataTable dt = (DataTable)Session["dt"];
            var row = dt.Rows.OfType<DataRow>().First(k => k["id"].ToString() == id.ToString());
            row["name"] = name.Text;
            dt.AcceptChanges();
            Session["dt"] = dt; 

            GuitarBrandsGridView.EditIndex = -1;
            bindgridviewguitarbrands();
        }
        // cancel row edit event
        protected void GuitarBrandsGridView_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            string id = GuitarBrandsGridView.DataKeys[e.RowIndex].Value.ToString();
            TextBox name = (TextBox)GuitarBrandsGridView.Rows[e.RowIndex].FindControl("TextBox2");

            int ID = Convert.ToInt32(id);

            GuitarBrandsGridView.EditIndex = -1;
            bindgridviewguitarbrands();
        }

BebeSaiyan

я обнаружил, что когда я пытался не включать RemoveCodeToGuitarFile в GuitarBrandsGridView_RowDeleting, все работает нормально всего одним щелчком мыши. Интересно, что заставляет его делать это, я могу полностью игнорировать это либо потому, что это то, что завершает мою программу на данный момент. Я включу код для RemoveCodeToGuitarFile, чтобы мы могли лучше его проанализировать.

BebeSaiyan

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for RemoveCodeToGuitarFile
/// </summary>
public static class RemoveCodeToGuitarFile
{
    static RemoveCodeToGuitarFile()
    {
        
    }

    public static void RemoveAddGuitarClass(string name)
    {
        int counter = 0;
        string line;

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs");
        while ((line = file.ReadLine()) != null)
        {
            if (line.Contains("            case \"" + name + "\":"))
            {
                break;
            }
            counter += 1;
        }
        file.Close();

        int removeAt = counter;//or any thing you want
        removeAt -= 1;
        int linesToRemove = 20; //or any thing you want
        string s = File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs");
        List<string> arr = s.Split("\n".ToCharArray()).ToList();

        string result = "";
        for (int i = 0; i < linesToRemove; i++)
        {
            arr.RemoveAt(removeAt);
            result = "";
            foreach (string str in arr)
            {
                result += str + "\n";
            }

            File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\AddGuitarClass.cs", result);

        }
    }

    public static void RemoveConnectionClassGuitarItems(string name)
    {
        int counter = 0;
        string line;

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs");
        while ((line = file.ReadLine()) != null)
        {
            if (line.Contains("    public static ArrayList GetItems" + name + "(string itemCategory)"))
            {
                break;
            }
            counter += 1;
        }
        file.Close();

        int removeAt = counter;//or any thing you want
        removeAt -= 2;
        int linesToRemove = 44; //or any thing you want
        string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs");
        List<string> arr = s.Split("\n".ToCharArray()).ToList();

        string result = "";
        for (int i = 0; i < linesToRemove; i++)
        {
            arr.RemoveAt(removeAt);
            result = "";
            foreach (string str in arr)
            {
                result += str + "\n";
            }

            System.IO.File.WriteAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\App_Code\ConnectionClassGuitarItems.cs", result);
        }
    }

    public static void RemoveOverviewGuitarDataASPX(string name)
    {
        int counter = 0;
        string line;

        // Read the file and display it line by line.
        System.IO.StreamReader file = new System.IO.StreamReader(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\OverviewGuitarData.aspx");
        while ((line = file.ReadLine()) != null)
        {
            if (line.Contains("    <h3>" + name + " Guitar Items Data</h3>"))
            {
                break;
            }
            counter += 1;
        }
        file.Close();


        int removeAt = counter;//or any thing you want
        removeAt -= 1;
        int linesToRemove = 70; //or any thing you want
        string s = System.IO.File.ReadAllText(@"C:\Users\User1\Documents\Visual Studio 2015\WebSites\MusicStore\Pages\Overv

BebeSaiyan

это часть его кода. Я не могу показать все это здесь, потому что это слишком долго.