1

我有一个通过 sqldatasource 从本地 sql db 填充的 gridview。

sqldatasource的select命令为:SelectCommand="SELECT * FROM [CERecord] ORDER BY [Priority]"

在我后面的代码中,我有一个单选按钮列表,其中显示所有记录、活动记录、已完成记录:

protected void rblShowRecords_SelectedIndexChanged(object sender, EventArgs e)
    {
        switch (rblShowRecords.SelectedValue)
        {
            case "Show Active/Completed":
                CEDatabaseSource.SelectCommand = "SELECT * FROM [CERecord] ORDER BY [Priority]";
                break;
            case "Show Active":
                CEDatabaseSource.SelectCommand = "SELECT * FROM [CERecord] WHERE [Completed]='false' ORDER BY [Priority]";
                break;
            case "Show Completed":
                CEDatabaseSource.SelectCommand = "SELECT * FROM [CERecord] WHERE [Completed]='true' ORDER BY [Priority]";
                break;
            default:
                break;
        }
        CEDatabaseSource.DataBind();
        gvRecordList.DataBind();
    }

当我在仅活动或仅完成模式下尝试更新行时,我遇到了一个奇怪的问题,即使我在上面的方法中设置了新命令,它似乎也只是开始显示所有行。

当您在gridview中单击一行上的更新时,它是否总是运行默认的选择命令:SelectCommand="SELECT * FROM [CERecord] ORDER BY [Priority]"

4

1 回答 1

0

当您单击行上的更新按钮时,它正在更改所选索引,因此它将运行您的 selectedIndexChanged 事件。

我能想到的每次单击网格时不触发此 SQL 的最佳方法是将代码移动到不会在每次单击时触发的不同方法中。

还值得注意的是,您使用的是内联 SQL——这是一个很大的安全漏洞。虽然对于 SELECT 语句来说并没有那么糟糕,但这是一个不好的习惯。使用一些参数化的存储过程或数据访问层来获取您的数据,并记住验证您的输入。

于 2013-03-14T15:43:08.970 回答