По-видимому, не генерирует правильную разметку GridView для __doPostBack - PullRequest
3 голосов
/ 01 февраля 2011

Я задал этот вопрос относительно странного поведения элемента управления GridView в ASP.Net (я использую C #).

Для каждой строки в моем GridView есть ссылки «Редактировать» и «Удалить». Например, в редактировании есть это javascript:__doPostBack('gvwServers','Edit$0') - поэтому, очевидно, сервер выяснит, что кто-то щелкнул для редактирования строки 0 из gvwServers.

Достаточно справедливо. Если я нажимаю ссылку «Изменить», я получаю постбэк, и GridView перерисовывается с кнопкой «Изменить», замененной кнопками «Обновить» и «Отмена». Стандартное поведение. СЕЙЧАС - кнопка «Отмена» имеет эту ссылку javascript:__doPostBack('gvwServers','Cancel$0') - именно то, что я ожидал. Отмена строки 0 из gvwServers. НО кнопка обновления имеет javascript:__doPostBack('gvwServers$ctl02$ctl00',''). Это, кажется, не имеет никакого смысла. И это, по-видимому, и является причиной того, что моя процедура обработки обновления не запускается.

Почему ASP не выводит правильные аргументы обратной передачи?

Мой код доступен по ссылке выше.

<asp:GridView ID="gvwServers" runat="server" class="gvwServers"  
AutoGenerateColumns="false"  OnRowEditing="gvwServers_Edit" 
onrowcancelingedit="gvwServers_Cancelling" onrowdeleting="gvwServers_Deleting" 
onrowupdated="gvwServers_Updated" onrowupdating="gvwServers_Updating"
AutoGenerateEditButton=true AutoGenerateDeleteButton=true>

<columns>
    <asp:CommandField  ShowEditButton="true" />
    <asp:CommandField  ShowDeleteButton="true" /> 
    <asp:BoundField DataField="intServerID" visible="false" />

    <asp:TemplateField HeaderText = "Server Name">
        <ItemTemplate>
            <asp:Label ID="lblServerName" runat="server" Text='<%# Bind("txtName") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="txtServerName_Edit" runat="server" Text='<%# Bind("txtName") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField  HeaderText = "Key">
        <ItemTemplate>
            <asp:Label ID="lblAppKey" runat="server" Text='<%# Bind("txtApplicationKey") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="txtAppKey_Edit" runat="server" Text='<%# Bind("txtApplicationKey") %>'></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

    <asp:TemplateField  HeaderText = "Connection String">
        <ItemTemplate>
            <asp:Label ID="lblConnString" runat="server" Text='************'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox runat="server" ID="txtConnString_Edit" Width="300px" Height="100px" Text='<%# Bind("txtConnectionString")%>' TextMode="MultiLine" ></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>

</columns>
</asp:GridView> 

1 Ответ

2 голосов
/ 01 февраля 2011

Не уверен, что вы ожидаете / не происходит. Я взял ваш код gridview и использовал ваш код в другой ссылке. Я добавил Response.Write в каждый обработчик, и он, кажется, работает как ожидалось.

public class Item
{
    public int intServerID { get; set; }
    public string txtName { get; set; }
    public string txtApplicationKey { get; set; }
    public string txtConnectionString { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
    Item item = new Item();
    item.intServerID = 1;
    item.txtName = "Apple";
    item.txtApplicationKey = "Orange";
    item.txtConnectionString = "Test";

    List<Item> items = new List<Item>();
    items.Add(item);

    gvwServers.DataSource = items;
    gvwServers.DataBind();
}

protected void gvwServers_Edit(object sender, GridViewEditEventArgs e)
{
    Response.Write("Edit");
    gvwServers.EditIndex = e.NewEditIndex;
    gvwServers.DataBind();
}
protected void gvwServers_Updated(object sender, GridViewUpdatedEventArgs e)
{
    Response.Write("Updated");
    gvwServers.DataBind();
}

protected void gvwServers_Updating(object sender, GridViewUpdateEventArgs e)
{
    Response.Write("Updating");
    gvwServers.DataBind();
}
protected void gvwServers_Deleting(object sender, GridViewDeleteEventArgs e)
{
    Response.Write("Delete");
    gvwServers.DataBind();
}
protected void gvwServers_Cancelling(object sender, GridViewCancelEditEventArgs e)
{
    Response.Write("Cancel");

    e.Cancel = true;
    gvwServers.EditIndex = -1;
    gvwServers.DataBind();
}
...