避免在数据库中插入任何空白行
我已经发布了一个线程,避免向数据库中添加空行。之前当点击添加行时,无论用户是否取消新行,它都会自动向数据库中添加一个空行。我想通了,但现在出现了一个新问题。如果用户在编辑新行时决定重新加载页面(F5),它将在数据库中添加一个空白行,这对我的情况来说是一个不行。任何人都可以帮我弄清楚如何避免这种情况?避免在数据库中插入任何空白行
下面是我的插入代码:
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Insert") //- this is needed to explain that the INSERT command will only work when INSERT is clicked
{
gv.DataBind();
DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");
string transCode = "", fundCode = "", BSA_CD = "", DP_TYPE = "";
if (d.Rows.Count > 0)
{
transCode = d.Rows[0]["TRANS_CD"].ToString();
fundCode = d.Rows[0]["FUND_CD"].ToString();
BSA_CD = d.Rows[0]["BSA_CD"].ToString();
DP_TYPE = d.Rows[0]["DP_TYPE"].ToString();
if (transCode.Trim().Length > 0)
{
dbcon.Execute("INSERT INTO CIS.CIS_TRANS (ID,TRANS_CD) VALUES(CIS.S_CIS_TRANS.nextval,'')", "ProjectCISConnectionString");
gv.DataBind();
}
}
gv.EditIndex = gv.Rows.Count - 1;
}
else if (e.CommandName == "Cancel")
{
DataTable d = dbcon.GetDataTable("SELECT * FROM CIS.CIS_TRANS ORDER BY ID DESC", "ProjectCISConnectionString");
string transCode = "";
if (d.Rows.Count > 0)
{
transCode = d.Rows[0]["TRANS_CD"].ToString();
if (transCode.Trim().Length == 0)
{
dbcon.Execute(string.Format("DELETE CIS.CIS_TRANS WHERE ID = '{0}'", d.Rows[0]["ID"]), "ProjectCISConnectionString");
gv.DataBind();
}
}
}
}
如果你想避免用户插入空行,你需要验证。添加RequiredFieldValidator
到插入模板:
<asp:RequiredFieldValidator runat="server" ID="valFieldName"
< ControlToValidate="txtFieldName" ErrorMessage="FieldName is missing" />
在如果Page.IsValid == true
你的方法检查你插入到数据库之前。
编辑: 如果你想避免回传完全,你可以插入整个网格为UpdatePanel
:
<asp:UpdatePanel>
<ContentTemplate>
<asp:GrdiView>
....
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
现在,当用户点击F5他只是再一次,而不是重新加载页面回发插入命令。
看起来像你试图把太多的逻辑放入代码的一部分。您将数据库逻辑放入按钮命令中。想象一下,用户只需扫描此按钮。这会导致大量的空行。
尝试这种方法:划分数据库逻辑和UI逻辑(例如MVVM)。今天这是一种常见模式。
想象一下,你创建的所有对象,现在用户点击“保存”按钮(也可以通过改变连续发生 - 不管)。在执行保存命令后,你的视图模型(视图背后的逻辑)可以例如验证您的数据。所以你可以更容易地扩展你的用户界面的功能(如说:验证或类似的东西)。
如果您想与您现有的代码要做到这一点,每一个扩张会越来越炸毁它 - 直等到维护这个代码是可怕的它并没有花太多时间。
在你的虚拟机happend一切(验证等)的交易指令到你的数据库可能发生之后(类似myEntities.Save())。这个方法提供了你的业务对象被正确转换成SQL并存储在数据库中。
这只是MVVM模式的一个非常简短的解释,但这似乎是我唯一适当的解决方案。
当你说“当用户试图在编辑时重新加载页面”是否意味着当用户在编辑表单时点击F5 ..? – MethodMan 2012-08-08 15:17:05
是或当他们只选择网址并点击输入。 – KKP 2012-08-08 15:20:25
为什么你在开始时调用'gv.DataBind();'? – 2012-08-08 15:21:48