2009-08-08 26 views
1

所以我嘗試了一個我的概念工具,我需要能夠真正輕鬆地從數據庫中讀取和寫入數據。我按照自己喜歡的方式設置了表單,並圍繞不同的文本框和下拉框讀取數據庫中的數據。我已經掌握了所有工作和所有工作,但是有一個小錯誤,我不完全明白爲什麼在那裏。某些文本框不會更新數據庫中的文本。但它似乎只是在數據庫中的數據不存在的情況下才會發生。因此,最後一行的值仍然懸掛在文本框中,因此單擊「更新」實際上會將來自最後一行的字段的值更新爲新行。搞砸了一切。從數據庫讀取/寫入時設計代碼流的最佳方式

現在,我最感興趣的是代碼的剪切流。佈置代碼來完成所有這些工作的最佳方式是什麼?到目前爲止,我有這樣的:

這是代碼在DataGridView的單元格,當點擊:

Private Sub DataGridView_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView.CellClick 

    On Error Resume Next 

    selectedName = Me.DataGridView.CurrentRow.Cells(0).Value 
    selectedGenre = Me.DataGridView.CurrentRow.Cells(1).Value 
    selectedRhytm = Me.DataGridView.CurrentRow.Cells(2).Value 
    selectedLength = Me.DataGridView.CurrentRow.Cells(3).Value 
    selectedFinished = Me.DataGridView.CurrentRow.Cells(4).Value 
    selectedSoundFile = Me.DataGridView.CurrentRow.Cells(5).Value 

    txtBoxName.Text = selectedName 
    txtBoxGenre.Text = selectedGenre 
    txtBoxRhytm.Text = selectedRhytm 
    txtBoxLength.Text = selectedLength 
    txtBoxFinished.Text = selectedFinished 
    txtBoxSoundFile.Text = selectedSoundFile 

End Sub 

的「選擇」 - 變量都在GlobalCode.vb我的所有聲明」我已經找到了所有這些供以後使用的地方。它們的定義如下:

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 

我以前沒有做過這樣的事情。我更像是一個設計師而不是程序員,但我真的需要嘗試一個概念,所以我不確定這是否是這樣做的方式。我發現它在大多數情況下都有效。但我認爲熟練的程序員有一種設計代碼佈局的方式,因此它的效率高,清晰易讀。 那麼這看起來如何?

+0

重新您的評論 - 我不知道一個可怕的很多關於適配器,說實話(我用ORM,而不是DataSet)。也許問作爲另一個具體問題? – 2009-08-08 12:55:02

回答

2

(我看不到這個問題相關的任何數據庫,順便說一句)

或許奠定了這段代碼的最好辦法是...不是。不要爲標準數據綁定框架可以處理的事物編寫代碼。例如(對不起,它是C#,但它應該翻譯 - 這裏的所有「好」位都由.NET框架提供,而不是語言);一些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); 
     } 
    } 
} 

隨着支持數據實體:

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"); } } 
} 
+0

最好的提示呢!正如你可能會說,我不是真正的程序員。所以這個任務真的是相關的 - 如何真正綁定數據:) – 2009-08-08 08:54:52

+0

只是試圖將文本框的值綁定到數據庫中的列。它工作的很好,沒有更多的bug :) 但是,數據不存儲。試圖插入以下內容: DataSourceDataSet.Songs.AcceptChanges() SongsTableAdapter.Update(Me。DataSourceDataSetSongs) 但數據庫中的數據未更新 – 2009-08-08 10:29:11

0

嘗試評論在錯誤恢復下一小會看到會發生什麼。我設法混淆了我自己的次數,而不是我可以指望的那樣。

編輯

我剛剛意識到這是VB.Net。在這種情況下,您不應該使用On Error Resume Next。使用Try Catch結構。

+0

好吧,我要試着去看看會發生什麼。 任何有關如何讓代碼繼續前進的想法,如果來自單元格的值是什麼都沒有? – 2009-08-08 08:51:38

+0

發現,這工作很好,thanx! :) – 2009-08-08 10:10:03

相關問題