[英]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())。
好的,现在你有一个方法可以一个一个地获取所有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.