OK, I think I see what's happening. In your grid you have this column:
<radG:GridBoundColumn DataField="ModuleId" UniqueName="ModuleId" HeaderText="ModuleId" HeaderStyle-CssClass="normal" ItemStyle-CssClass="normal" />
Then in your InsertParameters, you are assigning the same name:
<asp:ControlParameter ControlID="lblModuleId" Name="ModuleId" PropertyName="Text" Type="Int32" />
Because you are using AllowAutomaticInserts="True", the RadGrid will ignore your ControlParameter, because you have GridBoundColumn with the same name. The GridBoundColumn value is what is getting sent to your stored proc. Since you aren't setting that anywhere, the default value is used. You should be able to just set the ReadOnly property to True on your GridBoundColumn, and it will get ignored when passing to your stored proc.
<radG:GridBoundColumn ReadOnly="True" DataField="ModuleId" UniqueName="ModuleId" HeaderText="ModuleId" HeaderStyle-CssClass="normal" ItemStyle-CssClass="normal" />
This way, you don't have a column named ModuleID automatically sending a value. In your stored proc, you should have declared @ModuleID int. Since your stored proc needs a moduleid and the RadGrid isn't automatically sending one, it will look to your InsertParameters for the value.
LMK how you make out.