EnableViewState and Button Type(DataGrid中按钮类型与EnableViewState的关系)

We have a Datagrid which contains a template column with a button in it,
as well as an actual button column. If either of the buttons are
clicked, the ItemCommand event does not fire.

If however, the ButtonType of the ButtonColumn is changed to
"LinkButton" instead of "PushButton", the event fires normally!

Why on earth is this happening? I presume this a bug in .NET? (We are
using 1.1 final).

<asp:DataGrid id="JobsDataGrid" runat="server"
        AutoGenerateColumns="False"
        DataKeyField="JobNumber" >
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
    <asp:Button ID="RunJobButton" Runat="server"
        CommandName="RunJob"
        CommandArgument="1"
        Text="Run Task 1" />
</ItemTemplate>

</asp:TemplateColumn>
<asp:ButtonColumn ButtonType="PushButton" CommandName="RunJob"
    Text="Run Task 2" />
</Columns>
</asp:DataGrid>

Any ideas how to fix this would be appeciated.

Nick...
r.gifReply to this message...
 
    
Jeffrey Tan[MSFT] (VIP)
Hi Nick,

Thanks for posting in this group.
I think maybe you bind the database data into your datagrid every time in
WebForm load event.
Because when you click the button, the page postback to the server,
Page_Load event fires, the datagrid will be rebind again. So the
ItemCommand will not fire(the datagrid was reinitialized). (You can
demonstrate this through add a breakpoint in ItemCommand eventhandler)
So you should bind the datagrid only when the page is not postback.
Code snippet like this:

//I use default sqlserver database to fill the datagrid
private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    //Response.Write(Session[0]);
    Response.Write(this.GetPostBackEventReference(hoho));
    if(!IsPostBack)
    {
        SqlDataAdapter adapter=new SqlDataAdapter("select * from
jobs","server=localhost;database=pubs;uid=sa;pwd=");
        DataSet ds=new DataSet();
        adapter.Fill(ds);
        DataGrid1.DataSource=ds;
        DataGrid1.DataBind();
    }
}

this.DataGrid1.ItemCommand += new
System.Web.UI.WebControls.DataGridCommandEventHandler(this.DataGrid1_ItemCom
mand);

private void DataGrid1_ItemCommand(object source,
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    if(e.CommandName=="buttonclick")
    {
        Response.Write(e.Item.Cells[3].Text);
    }
}

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

r.gifReply to this message...
 
    
Nick Gilbert
Hi Jeffrey,

The datagrid needed to be rebound every single time as the data always
changed (it had a column which reflected the live status of a job).

The problem seems to be that if you bind on every postback *AND* have
viewstate turned on for the datagrid, the event does not fire. We
disabled viewstate on the datagrid and the ItemCommand events then fired
as expected.

Thanks for your help,

Nick...

Jeffrey Tan[MSFT] wrote:
[Original message clipped]

r.gifReply to this message...
 
    
Jeffrey Tan[MSFT] (VIP)
Hi Nick,

I am glad it works, if you have further questions, please feel free to tell
me.

Best regards,
Jeffrey Tan
Microsoft Online Partner Support
Get Secure! - www.microsoft.com/security
This posting is provided "as is" with no warranties and confers no rights.

r.gifReply to this message...
 
    
Sonali.NET[MVP] (VIP)
You might not be handling PostBack in the Page Load
Try adding the statements
if not Page.IsPostback then
'your code
end if

转载于:https://www.cnblogs.com/cy163/archive/2004/07/22/26634.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值