繁体   English   中英

C# DataGridView 按单元格值过滤行

[英]C# DataGridView Filtering rows by cell value

我想通过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;
    }

行动价值:

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; }
    }
}

表的外观

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

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

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

此外:每当 object 实现 IDisposable 时,使用using ,因此您可以确定 object 始终是 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确保在调用者停止枚举之前不会释放对象。 另外:如果调用者仅枚举前三个对象,则不会枚举 rest(而 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);
}
    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM