【问题标题】:How remove records from datagrid in asp.net if condition satisfy如果条件满足,如何从 asp.net 中的数据网格中删除记录
【发布时间】:2014-07-09 14:29:08
【问题描述】:

我在 ascx 文件中有一个这样的数据网格声明:

<asp:datagrid id="dgCompanies" Width="100%" AllowSorting="True" DataKeyField="companyId" AutoGenerateColumns="False"
            AllowPaging="True" AllowCustomPaging="True" OnPageIndexChanged="dgCompanies_Paging" Runat="server" onprerender="dgCompanies_PreRender" >

基本上,datagrid 是代码隐藏中的搜索结果:

// retrieve the matching company records
        IDataReader rdr = Syntegra.Manufacturing.WMCCM.Companies.Companies.ListCompanies(dgCompanies.CurrentPageIndex, pageSize, CompanyList, CompanyNameStartsWith, ProcessSqlClause, SkillSqlClause, LocationClause, KeywordSqlClause, User, Status, SearchPortalId, false, sortColumn, sortDirection);

        // highlight the sorted column
        highlightSortColumn();

        if (rdr.Read())
        {
            // calculate page details
            _count = (int) rdr["companyCount"];

            this.dgCompanies.VirtualItemCount = _count;


            // move onto the next resultset
            rdr.NextResult();

            // bind the data to the datagrid
            dgCompanies.PageSize = pageSize;
            dgCompanies.DataSource = rdr;
            dgCompanies.DataBind();

我需要检查 companyId 是否不等于某些值,然后我需要从搜索结果中删除该记录,这意味着将其从该 dgCompanies 数据网格中删除。我真的不知道我能做到这一点,有人可以在这里给我一些帮助吗?

【问题讨论】:

  • 你为什么不相应地填充阅读器?
  • 这是一个很好的建议,但我不知道如何修改该阅读器!我的理解是读者已经修复了这个命令:IDataReader rdr = Syntegra.Manufacturing.WMCCM.Companies.Companies.ListCompanies(dgCompanies.CurrentPageIndex, pageSize, CompanyList, CompanyNameStartsWith, ProcessSqlClause, SkillSqlClause, LocationClause, KeywordSqlClause, User, Status, SearchPortalId,假,排序列,排序方向);我不能改变吗?
  • 好的,让我在答案中指定
  • 查询修改困难。我认为它发生在您指定的ListCompanies 类中。

标签: c# asp.net datagrid


【解决方案1】:

良好的做法是根据所需条件填充数据读取器。

如果您想从数据读取器中过滤记录,可以将其加载到datatable

IDataReader rdr = Syntegra.Manufacturing.WMCCM.Companies.Companies.ListCompanies(dgCompanies.CurrentPageIndex, pageSize, CompanyList, CompanyNameStartsWith, ProcessSqlClause, SkillSqlClause, LocationClause, KeywordSqlClause, User, Status, SearchPortalId, false, sortColumn, sortDirection);
DataTable dt = new DataTable();
dt.Load(rdr);
rdr.Close();


for(int i = dt.Rows.Count-1; i >= 0; i--)
{
   DataRow dr = dt.Rows[i];

   int iCompanyId = Convert.ToInt(dr["CompanyId"]);

   if (IsCompanyHavingChoiceYes(iCompanyId))
    dr.Delete();
}   


dt.AcceptChanges();

dgCompanies.PageSize = pageSize;
dgCompanies.DataSource = dt;  //provide datatable as datasource
dgCompanies.DataBind();

从数据库中检查的方法:

private  bool IsCompanyHavingChoiceYes(int iCompanyId)
    {            
        string commandText = @"SELECT cn.companyId from companies cn 
                   INNER JOIN UserCompany uc ON uc.companyid = cn.companyid 
                   INNER JOIN Users u ON u.userId = uc.userId
                   INNER JOIN Choice c ON c.Email = u.Email And c.Choice = @Choice
                   WHERE cn.CompanyId = @CompanyId;";

        string connectionString = ConfigurationSettings.AppSettings["connectionString"];

        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            SqlCommand command = new SqlCommand(commandText, connection);
            command.Parameters.AddWithValue("@CompanyId", iCompanyId);
            command.Parameters.AddWithValue("@Choice", "YES");

            try
            {
                connection.Open();
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    return reader.HasRows;
                }

                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }
    }

http://i.stack.imgur.com/rPy3A.png

【讨论】:

  • 如何删除包含 companyId = (SELECT companyId FROM UserCompany WHERE userId IN (SELECT UserId FROM Users WHERE Email IN (SELECT Email FROM Choice WHERE Choice='YES')"的行
  • 我认为嵌套查询在 datatabledataview.Filter 表达式中都是不可能的。您必须修复对 datareader 的查询。
  • 你的意思是我需要在 :IDataReader rdr = Syntegra.Manufacturing.WMCCM.Companies.Companies.ListCompanies(dgCompanies.CurrentPageIndex, pageSize, CompanyList, CompanyNameStartsWith, ProcessSqlClause, SkillSqlClause, LocationClause, KeywordSqlClause , 用户, 状态, SearchPortalId, false, sortColumn, sortDirection);由于没有源代码,我无法在这里更改任何内容。
  • 我不明白为什么我不能在数据表中更改它?查询可以这样执行:stackoverflow.com/questions/23671575/…
  • 如果我使用您的代码,是否需要相应地更改行 highlightSortColumn() 和 if (rdr.Read()) ?
【解决方案2】:

您不能直接过滤IDataReader,因为它会被一一读取。

您只需使用 Load() 方法将所有数据从 datareader 加载到 DataTable

IDataReader rdr = Syntegra.Manufacturing.WMCCM.Companies.Companies.
                  ListCompanies(dgCompanies.CurrentPageIndex, pageSize, CompanyList,
                  CompanyNameStartsWith, ProcessSqlClause, SkillSqlClause, 
                  LocationClause, KeywordSqlClause, User, Status, SearchPortalId, false, 
                  sortColumn, sortDirection);
DataTable dt = new DataTable();
dt.(rdr);
//For filtering all the CompanyID column value not equal to  5
DataRow[] filteredRows=DataTable.Select("[CompanyID] <> 5 " ); 

dgCompanies.PageSize = pageSize;
dgCompanies.DataSource = filteredRows;
dgCompanies.DataBind();

【讨论】:

  • 这种方法有很多问题。我认为如果我能在聊天会话中解释会更好。我怎么能开始和你聊天?
  • 问题是如果我使用 dt.Load(rdr);稍后我会收到错误:异常详细信息:System.IndexOutOfRangeException: companyCount at Line 903:_count = (int) rdr["companyCount"];
猜你喜欢
  • 2019-11-01
  • 2015-10-13
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多