Database 从数据库读/写代码时设计代码流的最佳方法
因此,我正在尝试我的一个概念工具,我需要能够读写数据库中的数据非常容易。我已经按照自己的喜好设置了表单,并在不同的文本框和下拉框中展开,以从数据库中读取数据。我已经做好了所有的工作,但是有一个小错误,我不完全理解为什么会出现。某些文本框不会更新数据库中的文本。但它似乎只有在数据库中的数据为空时才会发生。因此,最后一行的值仍然挂起在文本框中,因此,单击“更新”实际上会将最后一行字段中的值更新到新行中。把一切都搞砸了 现在,我最感兴趣的是代码的剪切流。设计代码来完成所有这些工作的最佳方式是什么?到目前为止,我得到了这个: 这是单击datagridview中的单元格时的代码: “选定”变量都在GlobalCode.vb中声明,我在这里创建了所有这些变量供以后使用。它们的定义如下:Database 从数据库读/写代码时设计代码流的最佳方法,database,vb.net,data-structures,Database,Vb.net,Data Structures,因此,我正在尝试我的一个概念工具,我需要能够读写数据库中的数据非常容易。我已经按照自己的喜好设置了表单,并在不同的文本框和下拉框中展开,以从数据库中读取数据。我已经做好了所有的工作,但是有一个小错误,我不完全理解为什么会出现。某些文本框不会更新数据库中的文本。但它似乎只有在数据库中的数据为空时才会发生。因此,最后一行的值仍然挂起在文本框中,因此,单击“更新”实际上会将最后一行字段中的值更新到新行中。把一切都搞砸了 现在,我最感兴趣的是代码的剪切流。设计代码来完成所有这些工作的最佳方式是什么?到目
Friend Module GlobalVariables
Friend selectedName As String = Nothing
Friend selectedGenre As String = Nothing
Friend selectedRhytm As String = Nothing
Friend selectedLength As String = Nothing
Friend selectedFinished As String = Nothing
Friend selectedSoundFile As String = Nothing
End Module
我以前真的没有做过这样的事。我更像是一个设计师而不是程序员,但我真的需要尝试一个概念,所以我不确定这是一种什么样的方法。我发现它在大多数情况下都是有效的。但我认为熟练的程序员有一种设计代码布局的方法,因此它高效、干净且易于阅读。
那么这看起来怎么样呢?试着在下一步的错误恢复中注释一下,看看会发生什么。我对那句话感到困惑的次数多得数不清 编辑 我刚刚意识到这是VB.Net。在这种情况下,您永远不应该使用On Error Resume Next。使用结构。(顺便说一句,我在问题中看不到任何与数据库相关的内容) 也许最好的方法是。。。不可以。不要为标准数据绑定框架能够处理的事情编写代码。例如(抱歉,它是C#,但它应该翻译-这里所有的“好”部分都是由.NET framework提供的,而不是语言);某些UI代码-注意:没有用于复制值的代码:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
// some sample data
BindingList<Track> tracks = new BindingList<Track>();
tracks.Add(new Track { Name = "foo", Genre = "Rock", Rhythm = "insane", Length = 180 });
tracks.Add(new Track { Name = "bar", Genre = "Classic", Rhythm = "sedate", Length = 240 });
// show the data on a form
using (Form form = new Form {
Controls = {
new DataGridView { DataSource = tracks, Dock = DockStyle.Fill },
new TextBox { DataBindings = {{"Text", tracks, "Name"}}, Dock = DockStyle.Bottom},
new TextBox { DataBindings = {{"Text", tracks, "Genre"}}, Dock = DockStyle.Bottom},
new TextBox { DataBindings = {{"Text", tracks, "Rhythm"}}, Dock = DockStyle.Bottom},
new TextBox { DataBindings = {{"Text", tracks, "Length"}}, Dock = DockStyle.Bottom},
}
}) {
Application.Run(form);
}
}
}
静态类程序{
[状态线程]
静态void Main(){
Application.EnableVisualStyles();
//一些样本数据
BindingList轨迹=新建BindingList();
添加(新曲目{Name=“foo”,Genre=“Rock”,节奏=“疯狂”,长度=180});
添加(新曲目{Name=“bar”、Genre=“Classic”、节奏=“statese”、长度=240});
//在表单上显示数据
使用(表格=新表格){
控件={
新DataGridView{DataSource=tracks,Dock=DockStyle.Fill},
新文本框{DataBindings={“Text”,曲目,“Name”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={{“Text”,tracks,“Genre”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={“Text”,曲目,“节奏”},Dock=DockStyle.Bottom},
新的文本框{DataBindings={“Text”,tracks,“Length”},Dock=DockStyle.Bottom},
}
}) {
申请表格;
}
}
}
支持数据实体:
class Track : INotifyPropertyChanged {
private string name, genre, rhythm;
private int length;
public event PropertyChangedEventHandler PropertyChanged;
private void SetField<T>(ref T field, T value, string propertyName) {
if (!EqualityComparer<T>.Default.Equals(field, value)) {
field = value;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public string Name { get { return name; } set { SetField(ref name, value, "Name"); } }
public string Genre { get { return genre; } set { SetField(ref genre, value, "Genre"); } }
public string Rhythm { get { return rhythm; } set { SetField(ref rhythm, value, "Rhythm"); } }
public int Length { get { return length; } set { SetField(ref length, value, "Length"); } }
}
类轨迹:INotifyPropertyChanged{
私人弦乐名称、流派、节奏;
私有整数长度;
公共事件属性更改事件处理程序属性更改;
私有void设置字段(参考T字段、T值、字符串属性名称){
如果(!EqualityComparer.Default.Equals(字段,值)){
字段=值;
PropertyChangedEventHandler处理程序=PropertyChanged;
if(handler!=null)handler(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共字符串名称{get{return Name;}set{SetField(ref Name,value,“Name”);}
公共字符串类型{get{return Genre;}set{SetField(ref Genre,value,“Genre”);}
公共字符串节奏{get{return THERMAT;}set{SetField(参考节奏,值,“节奏”);}
公共整数长度{get{return Length;}set{SetField(ref-Length,value,“Length”);}
}
好的,我将尝试这样做,看看会发生什么。如果单元格中的值为零,您知道如何让代码继续运行吗?最好的提示!你可能知道,我不是真正的程序员。所以这个任务实际上与-如何真正绑定数据相关:)只是尝试将文本框的值数据绑定到数据库中的列。它工作得很好,没有更多的bug:)但是,数据没有存储。尝试插入以下内容:DataSourceDataSet.Songs.AcceptChanges()SongStableApter.Update(Me.DataSourceDataSet.Songs),但数据库中的数据未更新请注意您的评论-老实说,我对适配器了解不多(我使用ORM,而不是DataSet)。也许可以问另一个具体问题?
class Track : INotifyPropertyChanged {
private string name, genre, rhythm;
private int length;
public event PropertyChangedEventHandler PropertyChanged;
private void SetField<T>(ref T field, T value, string propertyName) {
if (!EqualityComparer<T>.Default.Equals(field, value)) {
field = value;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public string Name { get { return name; } set { SetField(ref name, value, "Name"); } }
public string Genre { get { return genre; } set { SetField(ref genre, value, "Genre"); } }
public string Rhythm { get { return rhythm; } set { SetField(ref rhythm, value, "Rhythm"); } }
public int Length { get { return length; } set { SetField(ref length, value, "Length"); } }
}