Not really sure if this will solve your problem but a couple of things that I would change are...
First...
In your .aspx page change the AutoPostBack attribute on your ddlModule DropDownList control to be false. Like this...
<asp:DropDownList ID="ddlModule" runat="server"
AutoPostBack="False" DataSourceID="SqlDataSource1" DataTextField="Module_Name"
DataValueField="ModuleId">
</asp:DropDownList>
I don't believe you need the drop list's AutoPostBack attribute to be True as you are using a button click event to fire the post-back.
Second...
In your aspx.cs page's Page_Load routine, wrap the bindgrid() function in a condition that checks if the page is a post back and only call the method if the page has not been posted back. The reasoning is, you are going to call the bindgrid() function in your button's click event and you don't want the Page Load to call this function on post backs triggered by the button. So, change your Page_Load routine to be this...
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack != true)
{
bindgrid();
}
}