我已广泛使用.Net框架用于后端进程和网页,但我从未需要使用Windows窗体。我使用Windows表单类型技术的唯一经验是Delphi 6& 7。
我搜索了教程,因为它们似乎对我要找的东西来说太基础了。或者它似乎不适合我想要做的事情。
我想在表单(我已经设法做)上有一个网格显示(为此我一直在使用DataGridView),以便用户可以查看,过滤和搜索数据。其他的事情,如分页也会涉及但我认为我可以找出如何为自己做这件事。
我遇到的所有示例都使用DataGridView进行编辑,添加和删除。我对用户使用网格的想法感到不舒服。这似乎令人困惑,而且可能非常容易出错。
我想有按钮来添加,编辑和删除各种类型的数据。因此,例如,如果我有一个表单来管理客户,我希望能够选择要编辑的行并单击按钮。这应该打开一个新的窗体表格,其中所有数据都预装在文本框,单选按钮,复选框和下拉列表等中。
如果他们点击添加,他们将转到与编辑相同的屏幕,除了所有信息都是空白。如果他们选择一行并单击删除,则会删除该客户并将其从DataGridView中删除。
我尝试了一些控件和数据绑定选项似乎从表中获取所有行。我怎样才能从数据库中获取我感兴趣的行。我不确定这里有什么最佳实践。
我现在正遭受信息过载的困扰,并且会感谢有人指出我正确的方向。
编辑:
我应该提一下,从我的Delphi时代起,我希望能够设置类似查询或SqlCommand(拖放gui)并设置其SQL属性,或者稍微参数化SQL。在表单上拖放数据源。将数据源指向SqlQuery / SqlCommand,然后单击命令上的activate。现在,我可以将组件拖放到表单上,并将其数据源属性设置为它们引用的字段。
答案 0 :(得分:2)
看看this sample。它显示了与WinForm控件(不仅仅是DataGridView)的基本ADO.NET绑定。
答案 1 :(得分:1)
你可以通过多种方式实现这一目标。并且有许多框架可以提供帮助。实体框架,NHiberbnate。
但是在较低级别,您可以使用与数据库相关的对象。 SqlConnection,SqlCommand,DataReader。下面是加载行的SQL-Server相关示例。
private IList<IPosition> PositionsLoad(SqlConnection connection, PositionsRequest request)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = connection;
cmd.CommandText = "select * from mytable WHERE x ";
cmd.CommandType = CommandType.Text;
//Get the reader
SqlDataReader reader = cmd.ExecuteReader;
IList<IPosition> ret = new List<IPosition>();
if (reader.HasRows()) {
//Create our converter to convert DataReader into a business object/s
DataReaderToPosition readerConvert = new DataReaderToPosition();
//loop rows
while (reader.Read) {
IPosition pos = readerConvert.DataReaderToBusinessObject(reader);
ret.Add(pos);
}
}
reader.Close();
return ret;
}
使用datareader:
Public Overrides Function DataReaderToBusinessObject(ByVal reader As System.Data.IDataReader) As IPosition
Dim res As IPosition = New Position
res.ItemDate = reader.GetDateTime(reader.GetOrdinal("Date"))
res.Strategy = reader.GetString(reader.GetOrdinal("Strategy"))
res.SubStrategy = reader.GetString(reader.GetOrdinal("SubStrategy"))
res.BrokerPrime = reader.GetString(reader.GetOrdinal("BrokerPrime"))
res.BrokerExecuting = reader.GetString(reader.GetOrdinal("BrokerExecuting"))
res.AccountName = reader.GetString(reader.GetOrdinal("AccountName"))
res.ExpectedLoss = reader.GetDouble(reader.GetOrdinal("Expected_Loss"))
res.RiskNotional = reader.GetDouble(reader.GetOrdinal("Risk_Notional"))
res.ModelDelta = reader.GetDouble(reader.GetOrdinal("Model_Delta"))
res.ExpectedTrancheLoss = reader.GetDouble(reader.GetOrdinal("Expected_Tranche_Loss"))
res.BaseCorrelation = reader.GetDouble(reader.GetOrdinal("Base_Correlation"))
res.LossOnSingleNameDefault = reader.GetDouble(reader.GetOrdinal("Loss_on_Single_Name_Default"))
res.RiskCapitalAllocation = reader.GetDouble(reader.GetOrdinal("Risk_Capital_Allocation"))
res.MarginFundingAllocation = reader.GetDouble(reader.GetOrdinal("Margin_Funding_Allocation"))
res.DataSource = reader.GetString(reader.GetOrdinal("DataSource"))
Return res
End Function