2011-02-01 11 views
3

this question私はASP.NetのGridViewコントロール(私はC#を使用しています)の奇妙な動作について尋ねました。__doPostBackの正しいGridViewマークアップが表示されない

GridViewの各行には、「編集」と「削除」リンクがあります。たとえば、編集にはjavascript:__doPostBack('gvwServers','Edit$0')が含まれています。サーバーは、誰かが0の行を編集するためにクリックしたことを明らかにする予定です。gvwServersです。

十分に適切です。編集リンクをクリックするとポストバックが取得され、編集ボタンが「更新」と「キャンセル」ボタンに置​​き換えられてGridViewが再描画されます。標準的な動作。 NOW - 'キャンセル'ボタンにはこのリンクがあります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> 
+0

すべてのgridviewコードを表示できますか? (上のリンクは編集/削除のみを表示しています)簡単な見落としがあるかもしれません。 – Wil

+0

@Wilマークアップで更新 –

答えて

2

期待していることと起こっていないことがわかりません。私はあなたの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(); 
} 
+0

gvwServers_Updatingルーチンが起動しますか?更新ボタンの上にカーソルを置いたときに__doPostBackの引数が何であるかを確認できますか? –

+0

私はこの答えを正しいとマークした理由は(私が思う)、データグリッドを生成するメソッドが正しいことです。つまり、 'Load'で' Init'で行っていました。これはどういうわけかハンドラの関連付けを破っているに違いありません。あなたはその光を放つことができますか? –

+0

Initは最初のロードでのみ実行され、それ以降のポストバックでは実行されません。 – Wil

関連する問題