【问题标题】:C# DataGridView Filtering rows by cell valueC# DataGridView 按单元格值过滤行
【发布时间】:2022-01-10 14:05:09
【问题描述】:

我想通过 Actionuserid 单元格值过滤我的 DataGridView 行。我只想看到 1 个用户行。

我的数据源是actionsBLL.ActionsList();

DataGridView填充代码:

        List<actionsVAL> ActionsList = actionsBLL.ActionsList();

        dataGridView_actions.DataSource = ActionsList;

        dataGridView_actions.RowHeadersVisible = false;
        dataGridView_actions.ReadOnly = true;

        dataGridView_actions.Columns[0].Width = 45;

        dataGridView_actions.Columns[1].Width = 110; 

        dataGridView_actions.Columns[2].Width = 70; 

        dataGridView_actions.Columns[3].Width = 90; 

        dataGridView_actions.Columns[4].Width = 114; 

动作列表:

    public static List<actionsVAL> ActionsList()
    {
        List<actionsVAL> sonuc = new List<actionsVAL>();
        OleDbCommand cmdactionlist = new OleDbCommand("SELECT  * from actions", dbConnection.conn); // tüm faaliyetleri gösteren sql sorgusu
        if (cmdactionlist.Connection.State != ConnectionState.Open) 
        {
            cmdactionlist.Connection.Open(); 
        }

       OleDbDataReader dr = cmdactionlist.ExecuteReader();
        while (dr.Read())
        {
            actionsVAL act = new actionsVAL();
            act.Actionid = int.Parse(dr["actionid"].ToString());
            act.Actionuserid = int.Parse(dr["userid"].ToString());
            act.Actionbookid = int.Parse(dr["bookid"].ToString());
            act.Actiondate = dr["actiondate"].ToString();
            act.Actiontype = dr["actiontype"].ToString();
            sonuc.Add(act);
        }
        dr.Close();
        return sonuc;
    }

ActionVAL:

namespace ValueObjectLayer
{
    public class actionsVAL
    {
        public int Actionid { get; set; }
        public int Actionbookid { get; set; }
        public int Actionuserid { get; set; }
        public string Actiontype { get; set; }
        public string Actiondate { get; set; }
    }
}

How Table Looks

【问题讨论】:

  • 您的问题缺少一个重要部分……一个实际问题。我们可以看到显示的网格和类,并且您想通过Actionuserid 过滤网格。我建议您对如何“过滤列表”进行一些研究……在这种情况下,它可能看起来像……var filteredList = ActionsList.Where(x =&gt; x.Actionuserid == targetValue。似乎没有代码显示您尝试“过滤”列表,因此除非我们知道什么没有按预期工作,否则很难提供帮助。

标签: c# winforms datagridview


【解决方案1】:

“我只想看到 1 个用户行。”您的意思是:我只想查看某个特定用户的行吗?

获取的数据不超过调用者想要的数据

首先,从数据库中获取数据时,不要获取所有项目。如果调用者只需要FirstOrDefault,或者只需要前几项,这将浪费处理能力。

此外:每当一个对象实现 IDisposable 时,使用using,这样您就可以确定该对象始终是 Disposed

public static IEnumerable<actionsVAL> FetchActions()
{
    using (OleDbConnection dbConnection = new OleDbConnection(...))
    {
        const string sqlText = "SELECT  * from actions";
        using (OleDbCommand cmdactionlist = new OleDbCommand(sqlText, dbConnection.conn))
        {
            dbConnection.Open();
            using (OleDbDataReader dataReader = cmdactionlist.ExecuteReader())
            while (dataReader.Read())
            {
                actionsVal action = new actionsVAL()
                {
                   Actionid = int.Parse(dr["actionid"].ToString());
                   Actionuserid = int.Parse(dr["userid"].ToString());
                   Actionbookid = int.Parse(dr["bookid"].ToString());
                   ...
                };
                yield return action;
            }
        }
    }
}

我还添加了打开和关闭 OleDbConnection。长时间保持此连接打开是不明智的。如果你愿意,你可以在这里删除它。我不确定您是否希望调用者为您创建一个 dbConnection,您是否决定更改它(= 打开它)。如果你相信你的调用者会创建一个 dbConnection,那么也相信他会为你打开它。

所有using 语句,确保创建的对象正确关闭和处置,即使在异常之后。

yield return 确保在调用者停止枚举之前不会释放对象。另外:如果调用者只枚举了前三个对象,则不枚举其余对象(而 dataReader.Read())。

只显示用户 X 的数据

好的,现在你有一个方法可以一个一个地获取所有actionsVal。您只想显示用户的actionsVal,其属性值ActionUserId 等于用户X 的ID

最好的方法是创建一个FetchActions(User X):

IEnumerable<ActionsVal> FetchActions(User X)
{
    const string sqlText = "Select * from actions where actionUserId = ..."

嗯,你确实比我更了解 SQL。

如果不想创建特殊程序,可以使用FetchActions()

IEnumerable<ActionsVal> FetchActions(User x)
{
    int actionUserId = x.ActionUserId;
    return this.FetchActions()
        .Where(action => actionUserId == actionUserId);
}

显示这些值的最佳方式是使用 DataGridView 的 DataSource。

在表单的构造函数中,您已经定义了哪一列将显示 ActionVal 的哪个属性:

InitializeComponents();

columnId.DataPropertyName = nameof(ActionsVal.Id);
columnName.DatePropertyName = nameof(ActionsVal.Name);
...

显示获取的 ActionVals:

public BindingList<ActionsVal> DisplayedActionVals
{
    get => (BindingList<ActionsVal>)this.dataGridView1.DataSource;
    set => this.dataGridView1.DataSource = value;
}

所以只显示用户 X 的 ActionsVal:

void ShowActionsVal(User x)
{
    IEnumerable<ActionsVal> actionValsToDisplay = this.FetchActions(x);
    this.DisplayedActionsVals = new BindingList<ActionsVal)(actionsValsToDisplay.ToList());
}

就是这样,用户 X 的所有 ActionsVals 都显示出来了。如果允许,操作员可以添加/删除行和编辑单元格。他甚至可以重新排列列和行。过了一会儿,他通过单击一个按钮表示他已完成编辑:

void OnButtonOk_Clicked(object sender, ...)
{
    this.ProcessEditedActions();
}

void ProcessEditedActions()
{
    ICollection<ActionsVal> editedActions = this.DisplayedActionsVals;

    // find out which ActionsVals are added / removed / changed
    this.ProcessEditedActions(editedActions);
}
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多