(MVC) MVC (2017)

Шаблон кода для роботи з DataGridView.

Це моя старенька програма від 2015-го року, яку я використовую для парсінга задач з різноманітних фрілансерских майданчиків, щоб поєднати усі задачки у одну таблу у зручному вигляді, швиденько її пролистати, та автоматично відписатися у цікаві для мене задачки. Вона виводить набагато більше інформації, що показують самі сайти, наприклад на скрині результат парсінку Upwork'а, на якому ви ніколи не побачите (наприклад) країну замовника, а я її бачу, та можу наприклад не звертати уваги на індусів та малазійців, а відразу відписуватися у більш багаті країни. Але я не буду вам описувати усього мого парсеру, це не є задача цієї сторінки, тут я лише опишу свій загальний шаблон коду для роботи з формами з мережею DataGridView.

На самій формі нічого цікавого немає, лише сама мережа, та декілька кнопок та надписів на верхньому тулбарі.



Сама форма відбирає дані за допомогою Linq-to-SQL, тому щоб автоматично вирішувалося питання чистки кешу Linq-to-SQL, я зробив ось такий єкстеншен.


   1:  Module LinqToSqlExtension4
   2:      ''' <summary>
   3:      ''' Return Linq-to-SQL context
   4:      ''' </summary>
   5:      ''' <typeparam name="T"></typeparam>
   6:      ''' <param name="value"></param>
   7:      ''' <param name="ClearCache">True, if need clear cache</param>
   8:      ''' <returns>Linq-to-SQL context</returns>
   9:      <System.Runtime.CompilerServices.Extension()> _
  10:      Public Function GetContext(Of T As System.Data.Linq.DataContext)(ByRef value As T, ByVal ClearCache As Boolean) As T
  11:          If value IsNot Nothing And Not ClearCache Then
  12:              Return value
  13:          Else
  14:              'create new
  15:              Dim ObjConstructors() As Reflection.ConstructorInfo = GetType(T).GetConstructors
  16:              'шукаємо CTOR без параметрів
  17:              For Each One In ObjConstructors
  18:                  If One.GetParameters.Count = 0 Then
  19:                      value = ObjConstructors(0).Invoke(Nothing)
  20:                      Return value
  21:                  End If
  22:              Next
  23:          End If
  24:      End Function
  25:  End Module

Шаблон коду для роботи з DataGridView виглядає ось так.


   1:  Public Class CheckForm
   2:   
   8:   
   9:      Property Start_I As Integer
  10:      Property End_I As Integer
  11:      Property MinSumm As Integer = 100
  12:      Property ZeroPrice As Boolean = False
  13:   
  14:      Dim db1 As ParserDBDataContext
  15:   
  16:      Dim TypeOfSort As Integer = 0
  17:      Dim MaxBids As Integer = 20
  18:      Dim ProjectType As Integer = 0
  19:   
  20:      Dim Projects As System.Collections.Generic.List(Of Freelancer.AllProject)
  21:      Dim WherePredicate As Expressions.Expression(Of Func(Of AllProject, Boolean))
  22:      Dim OrderPredicate As Expressions.Expression(Of Func(Of AllProject, Boolean))
  23:   
  24:      Private Sub LoadForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  25:          Me.Text = Me.Text & " (" & Start_I & "-" & End_I & ")"
  26:          db1.GetContext(True)
  27:          If ZeroPrice Then
  28:              MinSummToolStripTextBox1.Text = 0
  29:              WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ = 0 And x.i >= Start_I And x.i <= End_I
  30:          Else
  31:              MinSummToolStripTextBox1.Text = MinSumm
  32:              WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ >= MinSumm And x.i >= Start_I And x.i <= End_I
  33:          End If
  34:          Projects = (db1.AllProjects.Where(WherePredicate).OrderBy(Function(X As AllProject) X.ToMySkill).ThenBy(Function(X As AllProject) X.i)).ToList
  35:          'Projects = (From X In db1.AllProjects Select X Order By X.ToMySkill, X.i Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.i >= Start_I And X.i <= End_I).ToList
  36:          RowCountToolStripLabel.Text = Projects.Count
  37:          MaxBidsToolStripTextBox1.Text = MaxBids
  38:          DataGridView1.AutoGenerateColumns = False
  39:          DataGridView1.Columns(1).DataPropertyName = "Summ"
  40:          DataGridView1.Columns(2).DataPropertyName = "TimeType"
  41:          DataGridView1.Columns(3).DataPropertyName = "HourLeft"
  42:          DataGridView1.Columns(4).DataPropertyName = "BidCount"
  43:          DataGridView1.Columns(5).DataPropertyName = "Country"
  44:          DataGridView1.Columns(6).DataPropertyName = "Category"
  45:          DataGridView1.Columns(7).DataPropertyName = "Title"
  46:          DataGridView1.Columns(8).DataPropertyName = "TXT"
  47:          DataGridView1.DataSource = Projects
  48:          ProjectTypeToolStripComboBox.SelectedIndex = 0
  49:      End Sub
  50:   
  51:      Private Sub DataGridView1_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete
  52:   
  53:          For i As Integer = 0 To Projects.Count - 1
  54:              DataGridView1.Rows(i).Cells(0).ToolTipText = Projects(i).i
  55:              DataGridView1.Rows(i).Cells(1).ToolTipText = Projects(i).Category
  56:              DataGridView1.Rows(i).Cells(2).ToolTipText = Projects(i).Category
  57:              DataGridView1.Rows(i).Cells(3).ToolTipText = Projects(i).Category
  58:              DataGridView1.Rows(i).Cells(4).ToolTipText = Projects(i).Category
  59:              DataGridView1.Rows(i).Cells(5).ToolTipText = Projects(i).Country
  60:              DataGridView1.Rows(i).Cells(6).ToolTipText = DataGridView1.Rows(i).Cells(5).Value
  61:              '
  62:              Dim Style1 = New DataGridViewCellStyle()
  63:              Dim Blue As Integer = CInt(Math.Max(0, DataGridView1.Rows(i).Cells(3).Value)) * 10
  64:              If Blue > 255 Then Blue = 255
  65:              Style1.BackColor = Color.FromArgb(255, 255, Blue)
  66:              DataGridView1.Rows(i).Cells(3).Style = Style1
  67:              '
  68:              Dim Style2 = New DataGridViewCellStyle()
  69:              Dim Red As Integer = 350 - CInt(Math.Max(0, DataGridView1.Rows(i).Cells(1).Value))
  70:              If Red > 255 Then
  71:                  Red = 255
  72:              ElseIf Red < 0 Then
  73:                  Red = 0
  74:              End If
  75:              Style2.BackColor = Color.FromArgb(Red, 255, 255)
  76:              DataGridView1.Rows(i).Cells(1).Style = Style2
  77:              '
  78:              Dim Style3 = New DataGridViewCellStyle()
  79:              Dim Green As Integer = CInt(DataGridView1.Rows(i).Cells(4).Value) * 20
  80:              If Green > 255 Then Green = 255
  81:              Style3.BackColor = Color.FromArgb(255, Green, 255)
  82:              DataGridView1.Rows(i).Cells(4).Style = Style3
  83:              '
  84:              Dim Style4 = New DataGridViewCellStyle()
  85:              Dim Style41 = New DataGridViewCellStyle()
  86:              Style41.BackColor = Color.FromArgb(0, 255, 0)
  87:              Dim Style42 = New DataGridViewCellStyle()
  88:              Style42.BackColor = Color.FromArgb(0, 0, 255)
  89:              Dim Style43 = New DataGridViewCellStyle()
  90:              Style43.BackColor = Color.FromArgb(0, 128, 128)
  91:              If Projects(i).ProjectType = 2 Then
  92:                  DataGridView1.Rows(i).Cells(0).Style = Style41
  93:              ElseIf Projects(i).ProjectType = 1 Then
  94:                  DataGridView1.Rows(i).Cells(0).Style = Style42
  95:              ElseIf Projects(i).ProjectType = 3 Then
  96:                  DataGridView1.Rows(i).Cells(0).Style = Style43
  97:              End If
  98:              '
  99:              If SearchToolStripTextBox.Text <> "" Then
 100:                  Dim Style5 = New DataGridViewCellStyle()
 101:                  Style5.BackColor = Color.FromArgb(255, 128, 128)
 102:                  If DataGridView1.Rows(i).Cells(7).Value IsNot Nothing And DataGridView1.Rows(i).Cells(8).Value IsNot Nothing Then
 103:                      If DataGridView1.Rows(i).Cells(7).Value.ToString.ToLower.Contains(SearchToolStripTextBox.Text.ToLower) Or DataGridView1.Rows(i).Cells(8).Value.ToString.ToLower.ToLower.Contains(SearchToolStripTextBox.Text.ToLower) Then
 104:                          DataGridView1.Rows(i).Cells(8).Style = Style5
 105:                      End If
 106:                  End If
 107:              End If
 108:          Next
 109:      End Sub
 110:   
 111:   
 112:      Private Sub DataGridView1_CellContentDoubleClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentDoubleClick
 113:          If e.RowIndex >= 0 And e.ColumnIndex >= 6 Then
 114:              Process.Start("C:\Program Files\Mozilla Firefox\Firefox.exe", Projects(e.RowIndex).URL)
 115:          ElseIf e.RowIndex = -1 And e.ColumnIndex <= 6 Then
 116:              Rebind(e.ColumnIndex, False)
 117:          Else
 118:              ParsePage(e.RowIndex)
 119:          End If
 120:      End Sub
 121:   
 122:      Private Sub DelToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles DelToolStripButton1.Click
 123:          For i As Integer = 0 To DataGridView1.Rows.Count - 1
 124:              Dim Check1 As Boolean = Convert.ToBoolean(CType(DataGridView1.Rows(i).Cells(0), DataGridViewCheckBoxCell).Value)
 125:              If Check1 Then
 126:                  Debug.Print(i)
 127:                  Dim DelNum As Integer = CInt(DataGridView1.Rows(i).Cells(0).ToolTipText)
 128:                  Dim DelOne = (From X In db1.AllProjects Select X Where X.i = DelNum).ToList
 129:                  If DelOne.Count > 0 Then
 130:                      DelOne(0).Checked = 1
 131:                      db1.SubmitChanges()
 132:                  End If
 133:              End If
 134:          Next
 135:          db1.SubmitChanges()
 136:          Rebind(TypeOfSort, True)
 137:      End Sub
 138:   
 139:      Function ParseRestTime(One As String) As String
 140:          Dim Pos3 As Integer = One(8).ToString.IndexOf(">")
 141:          Dim Pos4 As Integer = One(8).ToString.IndexOf("<", Pos3)
 142:          Return One.Substring(Pos3, Pos4 - Pos3)
 143:      End Function
 144:   
 145:      Private Sub MaxBidsToolStripTextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles MaxBidsToolStripTextBox1.TextChanged
 146:          If Integer.TryParse(MaxBidsToolStripTextBox1.Text, MaxBids) And Integer.TryParse(MinSummToolStripTextBox1.Text, MinSumm) Then
 147:              If DataGridView1.DataSource IsNot Nothing Then
 148:                  Rebind(TypeOfSort, False)
 149:              End If
 150:          End If
 151:      End Sub
 152:   
 153:      Private Sub MinSummToolStripTextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles MinSummToolStripTextBox1.TextChanged
 154:          If Integer.TryParse(MaxBidsToolStripTextBox1.Text, MaxBids) And Integer.TryParse(MinSummToolStripTextBox1.Text, MinSumm) Then
 155:              If DataGridView1.DataSource IsNot Nothing Then
 156:                  Rebind(TypeOfSort, False)
 157:              End If
 158:          End If
 159:      End Sub
 160:   
 167:   
 168:      Private Sub RefreshToolStripButton_Click(sender As System.Object, e As System.EventArgs) Handles RefreshToolStripButton.Click
 169:          Rebind(TypeOfSort, False)
 170:      End Sub
 171:   
 172:      Private Sub ProjectTypeToolStripComboBox_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ProjectTypeToolStripComboBox.SelectedIndexChanged
 173:          ProjectType = ProjectTypeToolStripComboBox.SelectedIndex
 174:      End Sub
 175:   
 176:      Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
 177:          Dim GridView = DirectCast(sender, DataGridView)
 178:          If TypeOf GridView.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
 179:              Dim CurCell = CType(GridView.Rows(e.RowIndex).Cells(e.ColumnIndex), DataGridViewButtonCell)
 180:              Dim Style4 = New DataGridViewCellStyle()
 181:              Style4.BackColor = Color.FromArgb(60, 160, 100)
 182:              CurCell.Style = Style4
 183:              Dim DB_I As Integer = CInt(CType(GridView.Rows(e.RowIndex).Cells(0), DataGridViewCheckBoxCell).ToolTipText)
 184:              Dim OneDbRow As Freelancer.AllProject = (From Z In Projects Select Z Where Z.i = DB_I).First
 185:              Dim X As New CheckFormDetails
 186:              X.ShowTxt = OneDbRow.TXT
 187:              X.Title = OneDbRow.Title
 188:              X.URL = OneDbRow.URL
 189:              X.Show()
 190:          End If
 191:      End Sub
 192:   
 193:   
 194:      Sub Rebind(ByVal ColumnIndex As Integer, ByVal FullReload As Boolean)
 195:          Dim CurCursor = Me.Cursor
 196:          Me.Cursor = Cursors.WaitCursor
 197:          If FullReload Then
 198:              If ProjectType = 0 Then
 199:                  If ZeroPrice Then
 200:                      WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ = 0 And x.i >= Start_I And x.i <= End_I
 201:                  Else
 202:                      WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ >= MinSumm And x.i >= Start_I And x.i <= End_I
 203:                  End If
 204:                  Select Case ColumnIndex
 205:                      Case 0
 206:                          Projects = (db1.AllProjects.Where(WherePredicate).OrderBy(Function(X As AllProject) X.ToMySkill).ThenBy(Function(X As AllProject) X.i)).ToList
 207:                          TypeOfSort = 0
 208:                      Case 1
 209:                          OrderPredicate = Function(X As AllProject) X.Summ
 210:                          TypeOfSort = 1
 211:                      Case 2
 212:                          OrderPredicate = Function(X As AllProject) X.TimeType
 213:                          TypeOfSort = 2
 214:                      Case 3
 215:                          OrderPredicate = Function(X As AllProject) X.HourLeft
 216:                          TypeOfSort = 3
 217:                      Case 4
 218:                          OrderPredicate = Function(X As AllProject) X.BidCount
 219:                          TypeOfSort = 4
 220:                      Case 5
 221:                          OrderPredicate = Function(X As AllProject) X.Checked
 222:                          TypeOfSort = 5
 223:                      Case 6
 224:                          OrderPredicate = Function(X As AllProject) X.Category
 225:                          TypeOfSort = 6
 226:                  End Select
 227:                  Projects = (db1.AllProjects.Where(WherePredicate).OrderBy(OrderPredicate)).ToList
 228:              Else
 229:                  If ZeroPrice Then
 230:                      WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ = 0 And x.i >= Start_I And x.i <= End_I And x.ProjectType = ProjectType
 231:                  Else
 232:                      WherePredicate = Function(x As AllProject) x.Checked Is Nothing And x.BidCount < MaxBids And x.Summ >= MinSumm And x.i >= Start_I And x.i <= End_I And x.ProjectType = ProjectType
 233:                  End If
 234:                  Select Case ColumnIndex
 235:                      Case 0
 236:                          Projects = (db1.AllProjects.Where(WherePredicate).OrderBy(Function(X As AllProject) X.ToMySkill).ThenBy(Function(X As AllProject) X.i)).ToList
 237:                          TypeOfSort = 0
 238:                      Case 1
 239:                          OrderPredicate = Function(X As AllProject) X.Summ
 240:                          TypeOfSort = 1
 241:                      Case 2
 242:                          OrderPredicate = Function(X As AllProject) X.TimeType
 243:                          TypeOfSort = 2
 244:                      Case 3
 245:                          OrderPredicate = Function(X As AllProject) X.HourLeft
 246:                          TypeOfSort = 3
 247:                      Case 4
 248:                          OrderPredicate = Function(X As AllProject) X.BidCount
 249:                          TypeOfSort = 4
 250:                      Case 5
 251:                          OrderPredicate = Function(X As AllProject) X.Checked
 252:                          TypeOfSort = 5
 253:                      Case 6
 254:                          OrderPredicate = Function(X As AllProject) X.Category
 255:                          TypeOfSort = 6
 256:                  End Select
 257:                  Projects = (db1.AllProjects.Where(WherePredicate).OrderBy(OrderPredicate)).ToList
 258:              End If
 259:          Else
 260:              If ProjectType = 0 Then
 261:                  Select Case ColumnIndex
 262:                      Case 0
 263:                          Projects = (From X In Projects Select X Order By X.ToMySkill, X.i Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 264:                          TypeOfSort = 0
 265:                      Case 1
 266:                          Projects = (From X In Projects Select X Order By X.Summ Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 267:                          TypeOfSort = 1
 268:                      Case 2
 269:                          Projects = (From X In Projects Select X Order By X.TimeType Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 270:                          TypeOfSort = 2
 271:                      Case 3
 272:                          Projects = (From X In Projects Select X Order By X.HourLeft Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 273:                          TypeOfSort = 3
 274:                      Case 4
 275:                          Projects = (From X In Projects Select X Order By X.BidCount Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 276:                          TypeOfSort = 4
 277:                      Case 5
 278:                          Projects = (From X In Projects Select X Order By X.Country Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 279:                          TypeOfSort = 5
 280:                      Case 6
 281:                          Projects = (From X In Projects Select X Order By X.Category Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 282:                          TypeOfSort = 6
 283:                  End Select
 284:              Else
 285:                  Select Case ColumnIndex
 286:                      Case 0
 287:                          Projects = (From X In Projects Select X Order By X.ToMySkill, X.i Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 288:                          TypeOfSort = 0
 289:                      Case 1
 290:                          Projects = (From X In Projects Select X Order By X.Summ Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 291:                          TypeOfSort = 1
 292:                      Case 2
 293:                          Projects = (From X In Projects Select X Order By X.TimeType Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 294:                          TypeOfSort = 2
 295:                      Case 3
 296:                          Projects = (From X In Projects Select X Order By X.HourLeft Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 297:                          TypeOfSort = 3
 298:                      Case 4
 299:                          Projects = (From X In Projects Select X Order By X.BidCount Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 300:                          TypeOfSort = 4
 301:                      Case 5
 302:                          Projects = (From X In Projects Select X Order By X.Country Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 303:                          TypeOfSort = 5
 304:                      Case 6
 305:                          Projects = (From X In Projects Select X Order By X.Category Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm And X.ProjectType = ProjectType).ToList
 306:                          TypeOfSort = 6
 307:                  End Select
 308:              End If
 309:          End If
 310:   
 311:          DataGridView1.DataSource = Projects
 312:          RowCountToolStripLabel.Text = Projects.Count
 313:          Me.Cursor = CurCursor
 314:      End Sub
 315:   
 316:      Private Sub CheckAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckAll.Click
 317:          For Each One In Projects
 318:              One.Checked = 1
 319:          Next
 320:          db1.SubmitChanges()
 321:          Me.Close()
 322:      End Sub
 323:  End Class

Сама форма працює на Expression-функції, яка відбирає дані з бази по параметрам, які задаються в момент виклика форми. Спочатку цей код був зроблений на статичних linq, але як раз у цьму році я трохи зробив модифікацію цьєї форми та додав у код WherePredicate. Бо без цього виклик форми був невдалий. А виглядає виклик ось так.



 120:   
 121:      Dim ZeroPrice As Boolean = False
 122:      Private Sub CheckProjectToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckProjectToolStripButton.Click
 123:          Dim ShowCount As Integer = CInt(ToRowI.Text) - CInt(FromRowI.Text)
 124:          If CInt(ShowCount <= 1000) Then
 125:              GoTo RunShow
 126:          End If
 127:          Dim Res As MsgBoxResult = MsgBox("Are you sure?", MsgBoxStyle.OkCancel, "Display " & ShowCount & " rows")
 128:          If Res = MsgBoxResult.Ok Then
 129:  RunShow:
 130:              Dim CheckForm_Instance As New CheckForm
 131:              CheckForm_Instance.ZeroPrice = ZeroPrice
 132:              CheckForm_Instance.Start_I = CInt(FromRowI.Text)
 133:              CheckForm_Instance.End_I = CInt(ToRowI.Text)
 134:              CheckForm_Instance.MinSumm = CInt(MinSummToolStripTextBox1.Text)
 135:              CheckForm_Instance.ShowDialog()
 136:              RefreshCounterToolStripButton1_Click(Nothing, Nothing)
 137:          End If
 138:      End Sub
 139:   
 497:      Private Sub FromMinProceToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles FromMinProceToolStripMenuItem.Click
 498:          ZeroPrice = False
 499:      End Sub
 500:   
 501:      Private Sub ZeroPriceToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ZeroPriceToolStripMenuItem.Click
 502:          ZeroPrice = True
 503:      End Sub



This is another simple program with DataGridView, it can organize your URL, order it and set color mark various URL, story login/password and comment for various sites. Structure of grid form controls please see below.



And this is full code of grid form.


   1:  Imports System.Windows.Forms
   2:   
   3:  Public Class StartForm
   4:   
   5:      Dim FF As New Firefox
   6:      Public db1 As New Url_DB
   7:      Dim Rows As List(Of Site) = db1.Sites.OrderBy(Function(X) X.Pos).ToList
   8:      Dim EditFormInstance As New EditForm
   9:   
  10:      Public Enum nColumn
  11:          FF = 0
  12:          Color = 1
  13:          Down = 2
  14:          Up = 3
  15:          URL = 4
  16:          Login = 5
  17:          Comment = 6
  18:          Edit = 7
  19:          Del = 8
  20:      End Enum
  21:   
  22:      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
  23:          DataGridView1.AutoGenerateColumns = False
  24:          DataGridView1.DataSource = Rows
  25:      End Sub
  26:   
  27:      Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
  28:          Dim senderGrid = DirectCast(sender, DataGridView)
  29:          Dim ColorStyle = New DataGridViewCellStyle()
  30:              ColorStyle.BackColor = ColorRestore(Rows(e.RowIndex).Color)
  31:              Dim CurCell As DataGridViewCell = senderGrid(e.ColumnIndex, e.RowIndex)
  32:          If e.ColumnIndex = nColumn.URL Then
  33:              CurCell.ToolTipText = senderGrid(nColumn.Comment, e.RowIndex).Value
  34:              CurCell.Style = ColorStyle
  35:          ElseIf e.ColumnIndex = nColumn.Login Then
  36:              CurCell.ToolTipText = senderGrid(nColumn.Comment, e.RowIndex).Value
  37:              CurCell.Style = ColorStyle
  38:          ElseIf e.ColumnIndex = nColumn.Comment Then
  39:              CurCell.ToolTipText = senderGrid(nColumn.Comment, e.RowIndex).Value
  40:              CurCell.Style = ColorStyle
  41:          ElseIf e.ColumnIndex = nColumn.Color Then
  42:              CurCell.ToolTipText = Rows(e.RowIndex).Color
  43:          ElseIf e.ColumnIndex = nColumn.ff Then
  44:              CurCell.ToolTipText = Rows(e.RowIndex).I
  45:          ElseIf e.ColumnIndex = nColumn.Up Or e.ColumnIndex = nColumn.Down Then
  46:              CurCell.ToolTipText = Rows(e.RowIndex).Pos
  47:          ElseIf e.ColumnIndex = nColumn.Edit Or e.ColumnIndex = nColumn.Del Then
  48:              CurCell.ToolTipText = Rows(e.RowIndex).URL
  49:          End If
  50:   
  51:      End Sub
  52:   
  53:      Private Sub BtAdd_Click(sender As Object, e As EventArgs) Handles BtAdd.Click
  54:          EditFormInstance.EditMode = False
  55:          EditFormInstance.ShowDialog()
  56:      End Sub
  57:   
  58:      Private Sub ButtonGo_Click(sender As Object, e As EventArgs) Handles ButtonGo.Click
  59:          For Each OneRow As DataGridViewRow In DataGridView1.Rows
  60:              Dim Check1 As DataGridViewCheckBoxCell = OneRow.Cells(nColumn.FF)
  61:              If Check1.Value Then
  62:                  FF.OpenFirefoxInNewTab(OneRow.Cells(nColumn.URL).Value)
  63:              End If
  64:          Next
  65:      End Sub
  66:   
  67:      Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs)
  68:          If e.RowIndex >= 0 Then
  69:              Dim senderGrid = DirectCast(sender, DataGridView)
  70:              Dim CurRow = Rows(e.RowIndex)
  71:              If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewCheckBoxColumn AndAlso e.ColumnIndex = nColumn.FF Then
  72:                  Dim Check1 As DataGridViewCheckBoxCell = senderGrid(e.ColumnIndex, e.RowIndex)
  73:                  Check1.Value = Not Check1.Value
  74:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewImageColumn AndAlso e.ColumnIndex = nColumn.Color Then
  75:                  ColorClick(CurRow)
  76:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewImageColumn AndAlso e.ColumnIndex = nColumn.Up Then
  77:                  UpClick(CurRow)
  78:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewImageColumn AndAlso e.ColumnIndex = nColumn.Down Then
  79:                  DownClick(CurRow)
  80:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewImageColumn AndAlso e.ColumnIndex = nColumn.Edit Then
  81:                  EditClick(CurRow)
  82:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewImageColumn AndAlso e.ColumnIndex = nColumn.Del Then
  83:                  DelClick(CurRow)
  84:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewLinkColumn AndAlso e.ColumnIndex = nColumn.URL Then
  85:                  UrlClick(CurRow)
  86:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewTextBoxColumn AndAlso e.ColumnIndex = nColumn.Login Then
  87:                  LoginClick(CurRow)
  88:              ElseIf TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewTextBoxColumn AndAlso e.ColumnIndex = nColumn.Comment Then
  89:                  CommentClick(CurRow)
  90:              End If
  91:          End If
  92:      End Sub
  93:   
  94:      Sub ColorClick(CurRow As Site)
  95:          Dim ColorForm As New ColorDialog
  96:          If ColorForm.ShowDialog = DialogResult.OK Then
  97:              CurRow.Color = String.Format("{0:X2}", ColorForm.Color.R) & String.Format("{0:X2}", ColorForm.Color.G) & String.Format("{0:X2}", ColorForm.Color.B)
  98:              db1.SaveChanges()
  99:              DataGridView1.Refresh()
 100:          End If
 101:      End Sub
 102:   
 103:      Function ColorRestore(RGB As String) As Color
 104:          If RGB <> "" Then
 105:              Dim R As Integer = Convert.ToUInt32(Mid(RGB, 1, 2), 16)
 106:              Dim G As Integer = Convert.ToUInt32(Mid(RGB, 3, 2), 16)
 107:              Dim B As Integer = Convert.ToUInt32(Mid(RGB, 5, 2), 16)
 108:              Return Color.FromArgb(R, G, B)
 109:          Else
 110:              Return Color.White
 111:          End If
 112:   
 113:      End Function
 114:   
 115:   
 116:      Sub UpClick(CurRow As Site)
 117:          If CurRow.Pos Is Nothing Then CurRow.Pos = CurRow.I
 118:          Dim R As Site = Rows.Where(Function(X) X.I = CurRow.I).FirstOrDefault
 119:          R.Pos = CurRow.Pos - 1
 120:          db1.SaveChanges()
 121:          Rows = db1.Sites.OrderBy(Function(X) X.Pos).ToList
 122:          DataGridView1.DataSource = Rows
 123:          DataGridView1.Refresh()
 124:      End Sub
 125:   
 126:      Sub DownClick(CurRow As Site)
 127:          If CurRow.Pos Is Nothing Then CurRow.Pos = CurRow.I
 128:          Dim R As Site = Rows.Where(Function(X) X.I = CurRow.I).FirstOrDefault
 129:          R.Pos = CurRow.Pos + 1
 130:          db1.SaveChanges()
 131:          Rows = db1.Sites.OrderBy(Function(X) X.Pos).ToList
 132:          DataGridView1.DataSource = Rows
 133:          DataGridView1.Refresh()
 134:      End Sub
 135:   
 136:      Sub EditClick(CurRow As Site)
 137:          EditFormInstance.EditMode = True
 138:          EditFormInstance.CurEditRow = CurRow
 139:          EditFormInstance.URLTextBox.Text = CurRow.URL
 140:          EditFormInstance.LoginTextBox.Text = CurRow.Login
 141:          EditFormInstance.PassTextBox.Text = CurRow.Pass
 142:          EditFormInstance.CommentRichTextBox.Text = CurRow.Comment
 143:          EditFormInstance.ShowDialog()
 144:          DataGridView1.Refresh()
 145:      End Sub
 146:   
 147:      Sub DelClick(CurRow As Site)
 148:          Dim R As Site = Rows.Where(Function(X) X.I = CurRow.I).FirstOrDefault
 149:          db1.Sites.Remove(R)
 150:          db1.SaveChanges()
 151:          Rows = db1.Sites.OrderBy(Function(X) X.Pos).ToList
 152:          DataGridView1.DataSource = Rows
 153:          DataGridView1.Refresh()
 154:      End Sub
 155:   
 156:      Sub UrlClick(CurRow As Site)
 157:          FF.OpenFirefoxInNewTab(CurRow.URL)
 158:      End Sub
 159:   
 160:      Sub LoginClick(CurRow As Site)
 161:          EditClick(CurRow)
 162:      End Sub
 163:   
 164:      Sub CommentClick(CurRow As Site)
 165:          EditClick(CurRow)
 166:      End Sub
 167:   
 168:  End Class


Comments ( )
Link to this page: //www.vb-net.com/DataGridView/index.htm
< THANKS ME>