Asp.net GridView OnRowUpdating

限于喜欢 提交于 2019-12-13 02:01:09

问题


I am using OnRowUpdating in my gridview. It's fairly straight forward but for some reason it's not updating. It's as if it's not finding the EditTemplate controls. It's a bit different of a set up, as all the controls are in a single column (maybe this is causing the problems?) and it's set up in a "blog" format. I do not receive any runtime errors, so it must be logic. Here is the asp.

ASP

<asp:GridView ID="gvPosts" runat="server" AutoGenerateColumns="False" DataKeyNames="MessageID" GridLines="Vertical" BackColor="White" BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" ForeColor="Black" Width="693px"
             OnPageIndexChanging="gvPosts_PageIndexChanging" OnRowEditing="gvPosts_RowEditing"
             OnRowCancelingEdit="gvPosts_RowCancelingEdit" OnRowUpdating="gvPosts_RowUpdating" AllowPaging="True">
            <AlternatingRowStyle BackColor="#CCCCCC" />
            <Columns>
                <asp:TemplateField HeaderText="Posts" HeaderStyle-Font-Size="Larger">
                    <EditItemTemplate>
                        <asp:Textbox ID="tbGridTitle" runat="server" Text='<%# Bind("Title") %>' Font-Bold="true" Font-Size="Large" ForeColor="#cc0000"></asp:Textbox>
                        <div style="margin-left: 20px">
                            <p>
                                <asp:Textbox ID="tbGridAuthor" runat="server" Text='<%# Bind("Author") %>' Font-Bold="true" Font-Size="Small" Width="150px"></asp:Textbox>                             
                                <asp:label ID="lblDate" runat="server" Text='<%# Bind("Date","{0:MM/dd/yyyy}") %>' Font-Bold="true" Font-Size="Small" Width="100px"></asp:label>
                                <asp:label ID="lblIPAddress" runat="server" Text='<%# Bind("IPAddress") %>' Font-Bold="true" Font-Size="Small" Width="100px" Visible="false"></asp:label>
                                <%--<asp:Label ID="lblMID" runat="server" Text='<%# "ImageHandler.ashx?mid="+ Eval("MessageID") %>'></asp:Label>--%>
                            </p>
                        </div>
                        <div style="margin-left: 40px">
                            <asp:TextBox ID="tbGridMessage" runat="server" Text='<%# Bind("Message") %>' TextMode="MultiLine" Width="450px"></asp:TextBox>
                            <div>
                                <asp:Image ID="postImage" runat="server" ImageUrl='<%# "ImageHandler.ashx?mid="+ Eval("MessageID") %>' Width="400px" AlternateText="No Image" ImageAlign="Middle" />
                            </div>
                        </div>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label4" runat="server" Text='<%# Bind("Title") %>' Font-Bold="true" Font-Size="Large" ForeColor="#cc0000"></asp:Label>
                        <div style="margin-left: 20px">
                            <p>
                                <asp:Label ID="Label1" runat="server" Text='<%# Bind("Author") %>' Font-Bold="true" Font-Size="Small" Width="150px"></asp:Label>                             
                                <asp:Label ID="Label2" runat="server" Text='<%# Bind("Date","{0:MM/dd/yyyy}") %>' Font-Bold="true" Font-Size="Small" Width="100px"></asp:Label>
                                <asp:Label ID="lblIPAddress" runat="server" Text='<%# Bind("IPAddress") %>' Font-Bold="true" Font-Size="Small" Width="100px" Visible="false"></asp:Label>
                                <%--<asp:Label ID="lblMID" runat="server" Text='<%# "ImageHandler.ashx?mid="+ Eval("MessageID") %>'></asp:Label>--%>
                            </p>
                        </div>
                        <div style="margin-left: 40px">
                            <asp:Label ID="Label3" runat="server" Text='<%# Bind("Message") %>'></asp:Label>
                            <div>
                                <asp:Image ID="postImage" runat="server" ImageUrl='<%# "ImageHandler.ashx?mid="+ Eval("MessageID") %>' Width="400px" AlternateText="No Image" ImageAlign="Middle" Visible="false" />
                            </div>
                        </div>
                    </ItemTemplate>
                    <HeaderStyle Font-Size="Large" />
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton runat="server" Text="View Comments" OnClick="lbViewComments_Click"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="MessageID" SortExpression="MessageID" Visible="true">
                    <ItemTemplate>
                        <asp:Label ID="lblMessageID" runat="server" Text='<%# Bind("MessageID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ShowHeader="False">
                    <EditItemTemplate>
                        <asp:LinkButton ID="lbUpdate" runat="server" CausesValidation="True" CommandName="Update" Text="Update"></asp:LinkButton>
                        &nbsp;<asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel"></asp:LinkButton>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField ShowHeader="False" Visible="False">
                    <ItemTemplate>
                        <asp:LinkButton ID="lbDelete" runat="server" CausesValidation="False" CommandName="Delete" Text="Delete" OnClick="lbDelete_Click"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

And here is my code behind for the RowUpdating..

C#

    protected void gvPosts_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow gvr = (GridViewRow)gvPosts.Rows[e.RowIndex];

        int MessageID = Convert.ToInt32(gvPosts.DataKeys[e.RowIndex].Value.ToString());
        TextBox Title = (TextBox)gvr.FindControl("tbGridTitle");
        TextBox Message = (TextBox)gvr.FindControl("tbGridMessage");
        TextBox Author = (TextBox)gvr.FindControl("tbGridAuthor");

        try
        {
            conn.Open();
            SqlCommand cmdUpdate = new SqlCommand("UPDATE BlogMessages SET Title = @Title, Message = @Message, Author = @Author WHERE MessageID = @MessageID", conn);
            cmdUpdate.Parameters.AddWithValue("@MessageID", MessageID);
            cmdUpdate.Parameters.AddWithValue("@Title", Title.Text);
            cmdUpdate.Parameters.AddWithValue("@Message", Message.Text);
            cmdUpdate.Parameters.AddWithValue("@Author", Author.Text);
            cmdUpdate.ExecuteNonQuery();
            conn.Close();

            gvPosts.EditIndex = -1;

            DataBound();
            GridControls();
        }
        catch (Exception ex)
        {
            lblMessage.Text = "Couldn't update! " + ex.ToString();
        }
    }

Everything else like the RowEditing and RowEditCanceling but for some reason, I'm unable to update. I think some fresh eyes might be able to catch what I'm missing.

I have also tried this for finding the controls but no luck.

TextBox Title = (TextBox)gvPosts.Rows[e.RowIndex].FindControl("tbGridTitle");

I have tried multiple things but I don't remember them all. Thanks in advance!


回答1:


The order in which your events are firing might be the problem.Make sure you have the same set up as the one below and modify it to suit your needs.I tried this with your markup and it works. I created a Post class

 public class Post 
{
    public String Author { get; set; }
    public String Title { get; set; }
    public DateTime Date { get; set; }
    public String IPAddress { get; set; }
    public String Message {get;set;}
    public String MessageID { get; set; }

}

And then tested it with this code

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

    public void BindData()
    {
        ArrayList myList = new ArrayList();

        myList.Add(new Post() { Author = "Abide", Title = "The Post", Date = DateTime.Now, IPAddress = "192.168.0.9", Message = "It works", MessageID = "5" });

        gvPosts.DataSource = myList;
        gvPosts.DataBind();
    }
    protected void gvPosts_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        GridViewRow gvr = (GridViewRow)gvPosts.Rows[e.RowIndex];

        int MessageID = Convert.ToInt32(gvPosts.DataKeys[e.RowIndex].Value.ToString());
        TextBox Title = (TextBox)gvr.FindControl("tbGridTitle");
        TextBox Message = (TextBox)gvr.FindControl("tbGridMessage");
        TextBox Author = (TextBox)gvr.FindControl("tbGridAuthor");

     // do your stuff here

    }

    protected void gvPosts_RowEditing(object sender, GridViewEditEventArgs e)
    {
        gvPosts.EditIndex = e.NewEditIndex;
        BindData();

    }

    protected void gvPosts_RowCommand(object sender, GridViewCommandEventArgs e)
    {

    }

    protected void gvPosts_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        gvPosts.EditIndex = -1;
        BindData();

    }


}



回答2:


Turns out I overlooked my Page_Load. I had..

if(Page.IsPostBack)
{
    //code here
}

Instead of..

if(!Page.IsPostBack)
{
    //code here
}

New day, fresh eyes and finally caught my mistake. Hopefully this saves someone time in the future.



来源:https://stackoverflow.com/questions/20337203/asp-net-gridview-onrowupdating

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!