#### What Will I Learn? This tutorial demonstrates how to create a User Control to extend the functionality of the Binding Navigator component. #### Requirements - Visual Studio Code - Northwind database #### Difficulty - Intermediate #### Tutorial Contents - Binding Navigator Component in Visual Studio - Implementing a Generic Table Update Interface - Extending the Binding Navigator Control - Prompting the User for Saves ### Extending the Forms Binding in Visual Studio Visual Studio offers fantastic improvements in rapidly constructing Windows and Smart Client applications. The Data Sources panel automates placing controls on a form and binding them through the Binding Source component. While the Binding Navigator component offers great potential, some simple extensions vastly improve its capability to completely automate navigation and CRUD functionality for data access. This tutorial demonstrates how to create a User Control to extend the functionality of the Binding Navigator component. Much of the increased functionality is gained by extending the Binding Navigator component in a user control to automate the saving of edited data. In the process, the Binding Source control needs to be extended and an interface template needs to be added to the data access logic. #### Binding Navigator Component in Visual Studio Create a new Windows application and add a new Data Source (DataSet) based on the Customer and Order tables in the Northwind database. The Data Sources panel offers the convenience of dragging tables or fields from a Typed Dataset and dropping them on a form to create fully bound and ready to use data access logic. Use the new data source created above to drag the Customer table onto the form. The wizard then creates an instance of the dataset, a Binding Source component linked to the table in the dataset, and a Binding Navigator component linked to the binding source. If the dataset is local to the project, the wizard also instantiates a table adapter and adds a call to the Fill method. (But if you are using an Object Data Source, you have to add this code manually.) The Binding Navigator places a tool strip docked to the top of the form that allows user navigation through the records. Buttons are provided to navigate to the first, previous, next and last records as well as any relative position by typing an index number.  Buttons are also added to add records, delete records and save edits. The save button (diskette icon) is added specifically by the Data Sources wizard and is not part of the standard navigation bar. It is this save button that has instigated this article. When the wizard adds the save button to the navigation strip, the proper code will be generated if the dataset is local to the project (as apposed to an Object Data Source.) The following method is added for the Customer table: ``` Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CustomersBindingNavigatorSaveItem.Click Me.Validate() Me.CustomersBindingSource.EndEdit() Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) End Sub ``` The Validate command closes out the editing of a control; the EndEdit method of the binding source writes any edited data in the controls back to the record in the dataset; and then the Update command of the table adapter sends updated records back to the database. #### Implementing a Generic Table Update Interface We need to create generic code to Fill and Update the data table. In part 3 of my previous article, I showed the code to wrap the data access logic in the business layer. Since then, I have revised the structure slightly to make use of the data table subclass to make the methods more consistent. To enforce this consistency, we need to create an interface that each table class should implement in the wrapper. **Step 1**: In Solution Explorer, right click on the project and click Add, New Item. **Step 2**: Choose a Class Item and name it _Interface (so it sorts to the top). This will be a utilities type of class where general methods are kept that can be accessed through out the program. **Step 3**: Create an Interface called ITableUpdate which requires a Fill method and an Update method. ``` Public Class _Interface ''' <summary> ''' Interface for Data table in a dataset to standardize fill and update methods ''' </summary> Public Interface ITableUpdate Sub Fill() Sub Update() End Interface End Class ``` In the Partial Class behind the DataSet (right click on the dataset and click View Code), create the following template code for each updateable table in the DataSet. In this example, I am implementing the Customer class for the NorthwindDataSet. ``` Partial Class NorthwindDataSet Shared taCustomer As New NorthwindDataSetTableAdapters.CustomersTableAdapter Partial Class CustomersDataTable Implements _Interface.ITableUpdate Public Sub Fill() Implements _Interface.ITableUpdate.Fill taCustomer.Fill(Me) End Sub Public Sub Update() Implements _Interface.ITableUpdate.Update taCustomer.Update(Me) End Sub End Class End Class ``` By implementing the interface, a generic UI call can work for any table. Now the Save method can call the update using generic code instead of calling an update method specific for the Customer table. Then the save routine can be written once and reused rather than written specifically for each table. #### Extending the Binding Navigator Control One way to fix the problems of the navigation toolbar and extend the functionality is to create a user control based on the Binding Navigator control and then add the properties and methods that are needed. 1- Right click on the Windows project and Add, New Item. From the list of items, select the User Control and give it a name of "exBindingNavigator.vb". (If you want to use this enhancement in other applications, the user controls and custom controls should be in a separate project that can be added to each solution. For this demonstration, leave it in the Windows project.) 2- VS will create a blank control with an empty container. Click and drag the bottom right corner until it is the size of the Binding Navigator tool bar. 3- Switch back to the Customer form (or any form where the Data Sources wizard has created the navigation control) and copy the navigation tool bar. 4- Switch back to the user control and paste the navigation bar into the container. 5- In the properties box, rename the Navigator from CustomerBindingNavigator to something more generic like GenericBindingNavigator. 6- Click on the save button (diskette icon) and in the properties panel, change the name to a more general name of BindingNavigatorSaveItem. 7- Right click on the form and select View Code to open the code page. Add a Sub New constructor. In the constructor, set the Dock property to the top of the form. ``` Public Class exBindingNavigator Public Sub New() ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. Me.Dock = DockStyle.Top End Sub End Class ``` 8- First, we need a property to track the reference to the binding source for the embeded navigator control. One of the tasks when the binding source is defined is to get a reference to the underlying table. We could include the code to get the reference to the table here, but sometimes, the data source has not been defined before the binding source is defined, or the data source may change. Therefore, an event handler is added to handle the Data Source Changed event and an method is called to set the table reference. To fill the table automatically, a reference to the containing form is derived and the Form Load event is subscribed to. ``` Private WithEvents _BindingSource As BindingSource Public Property BindingSource() As BindingSource Get Return _BindingSource End Get Set(ByVal value As BindingSource) GenericBindingNavigator.BindingSource = value _BindingSource = value If Not _BindingSource Is Nothing Then 'subscribe to the events in case not yet set AddHandler _BindingSource.DataSourceChanged, _ AddressOf bs_DataSourceChanged 'get a reference to the table now bs_DataSourceChanged(New Object, New EventArgs) End If End Set End Property ``` 9- Add the following method to handle the data source changed event above. ``` Private Sub bs_DataSourceChanged(ByVal sender As Object, ByVal e As EventArgs) If Not _BindingSource Is Nothing Then _DataTable = GetTableFromBindingSource(GenericBindingNavigator.BindingSource) If Not _DataTable Is Nothing Then 'if child BS, get reference to parent BS Dim testBS As BindingSource = _ TryCast(GenericBindingNavigator.BindingSource.DataSource, BindingSource) If Not testBS Is Nothing Then ParentBindingSource = testBS 'call the getter to capture event End If End If End If End Sub ``` Another method is needed to get the table reference from a Binding Source as used above. The Binding Source has two properties that determine which table to bind to: the Data Source and the Data Member. Most of the time, The Data Source is set to an instance of a DataSet and the Data Member is the name of the table in the DataSet. But in situations with parent-child relationships, the Data Source can be another Binding Source and the Data Member is the name of the relationship. Therefore, we need a little calculation to deduce the table. 10- Add a method called GetTableFromBindingSource which passes a Binding Source as a parameter and returns a reference to a Data Table. ``` Public Function GetTableFromBindingSource(ByVal bs As BindingSource) 'get a reference to the dataset Dim ds As DataSet, dt As DataTable 'try to cast the data source as a binding source Dim bsTest As BindingSource = bs Do While Not TryCast(bsTest.DataSource, BindingSource) Is Nothing 'if cast was successful, walk up the chain until dataset is reached bsTest = CType(bsTest.DataSource, BindingSource) Loop 'since it is no longer a binding source, it must be a dataset If TryCast(bsTest.DataSource, DataSet) Is Nothing Then 'Cast as dataset did not work Throw New ApplicationException("Invalid Binding Source ") End If ds = CType(bsTest.DataSource, DataSet) 'check to see if the Data Member is the name of a table in the dataset If ds.Tables(bs.DataMember) Is Nothing Then 'it must be a relationship instead of a table Dim rel As System.Data.DataRelation = ds.Relations(bs.DataMember) If Not rel Is Nothing Then dt = rel.ChildTable Else Throw New ApplicationException("Invalid Data Member") End If Else dt = ds.Tables(bs.DataMember) End If If TryCast(dt, ITableUpdate) Is Nothing Then Throw New ApplicationException("Table " & dt.TableName & _ " does not implement ITableUpdate interface") End If Return dt End Function ``` To get the table, we first need a reference to the dataset. If the Data Source casts correctly as a Binding Source, then we must walk back up the chain until we get to the original dataset. Once we have the dataset, we can see if the Data Member is a table in the dataset. If it is not, then it must be a relation. Looking up the relation in the set of relations in the dataset, we can get the table reference from the Child table property of the relation. Once we get a reference to the table, we can use polymorphism to cast it as the interface we created earlier. If it does not cast, it means that the data table did not implement the interface correctly and an exception should be thrown. If it does cast, then the generic update routine can be called to save the data. 11- Add the following method into the exBindingNavigator class to cover the click event of the save button. (You can double click on the save button to generate the code stub.) ``` Private Sub SaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.Validate() _BindingSource.EndEdit() 'cast table as ITableUpdate to get the Update method CType(_DataTable, _Interface.ITableUpdate).Update() IsDataDirty = False End Sub ``` 12- By adding another method to handle the Form Load event, you could have the table automatically fill itself when the form opens. This is not always needed since the tables are many times filled as needed, using logic. Therefore, this function should be selectable by adding another property, allowing the developer to choose. ``` Private _AutoFillFlag As Boolean = True Public Property AutoFillFlag() As Boolean Get Return _AutoFillFlag End Get Set(ByVal value As Boolean) _AutoFillFlag = value End Set End Property Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) If _AutoFillFlag Then 'cast table as ITableUpdate to get the Fill method CType(_DataTable, _Interface.ITableUpdate).Fill() End If End Sub ``` 13- Lastly, by subscribing to the load event of the parent form, all this should happen. When the load event of the user control fires, we can get a reference to the parent form. ``` Private Sub exBindingNavigator_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'get the reference to the hosting form Dim frm As Object = CType(Me, ContainerControl).ParentForm While TryCast(frm, System.Windows.Forms.Form) Is Nothing 'if not a form, walk up chain If Not TryCast(frm, System.ComponentModel.Container) Is Nothing Then frm = CType(frm, ContainerControl).Parent Else frm = CType(frm, Control).Parent End If End While _Form = CType(frm, System.Windows.Forms.Form) 'add the handler for the Form Load to fill the table AddHandler _Form.Load, AddressOf Form_Load End Sub ``` Now, by adding this control to your form and setting the Binding Source property, the save button will be functional with what ever dataset you are using and with the property set, the table will automatically fill (as long as the table implements the interface). #### Prompting the User for Saves The next problem is that the user may want to be warned and given the option of changing data or rolling back the edits. Of course this should be an option, so first we need another property called AutoSave that if false, prompts the user before making the save. 1- Add this code to the Property region of the code page. ``` Private _AutoSaveFlag As Boolean Public Property AutoSaveFlag() As Boolean Get Return _AutoSaveFlag End Get Set(ByVal value As Boolean) _AutoSaveFlag = value End Set End Property ``` 2- The above handler for the Position Changed event can be modified to check the flag and prompt the user if needed. ``` Private Sub bs_PositionChanged(ByVal sender As Object, ByVal e As EventArgs) _ Handles _BindingSource.PositionChanged If (_IsDataDirty And Not _DataTable Is Nothing) Then Dim msg As String = "Do you want to save edits to the previous record?" If _AutoSaveFlag Or MessageBox.Show(msg, "Confirm Save", _ MessageBoxButtons.YesNo) = DialogResult.Yes Then SaveItem_Click(New Object(), New EventArgs()) Else _DataTable.RejectChanges() MessageBox.Show("All unsaved edits have been rolled back.") _IsDataDirty=False End If End If End Sub ``` 3- While we are prompting the user, the Delete record routine needs a prompt to confirm deletes. First, we need to turn off the built-in method. In the designer view of the user control, select the Binding Navigator tool strip. In the properties panel, find the property for DeleteItem (in the Items section) , drop down the list and choose (none).  4- We need another method to delete the records only after prompting. Double click on the Delete icon (red X) in the toolbar to create a code stub and add the following: ``` Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click Dim msg As String = "Are you sure you want to delete the current record? " If _AutoSaveFlag Or MessageBox.Show(msg, "Confirm Delete", _ MessageBoxButtons.YesNo) = DialogResult.Yes Then 'Delete the current record _BindingSource.RemoveCurrent() CType(_DataTable, Win._Interface.ITableUpdate).Update() End If End Sub ``` The Binding Navigator component can be easily extended by making it into a user control and adding properties and methods. Adding this user control to a form will implement auto filling of a data table, implement the update functionality (with user prompting), and allow specific record lookup. By putting the user control into a control library project, it can be added to any solution and speed development of data access applications. Implementing the Interface in the Data Access logic quickly creates stubs for the needed methods for each table in the dataset, but some code does need to be written. But, this is very structured code and can easily be generated using CodeDom or a 3rd party code generation system. <br /><hr/><em>Posted on <a href="https://utopian.io/utopian-io/@yissakhar/extending-the-forms-binding-in-visual-studio">Utopian.io - Rewarding Open Source Contributors</a></em><hr/>
author | yissakhar | ||||||
---|---|---|---|---|---|---|---|
permlink | extending-the-forms-binding-in-visual-studio | ||||||
category | utopian-io | ||||||
json_metadata | "{"community":"utopian","app":"utopian/1.0.0","format":"markdown","repository":{"id":41881900,"name":"vscode","full_name":"Microsoft/vscode","html_url":"https://github.com/Microsoft/vscode","fork":false,"owner":{"login":"Microsoft"}},"pullRequests":[],"platform":"github","type":"tutorials","tags":["utopian-io","visual-studio"],"moderator":{"account":"cha0s0000","time":"2018-03-12T13:21:27.763Z","reviewed":true,"pending":false,"flagged":false},"questions":[{"question":"Is the project description formal?","answers":[{"value":"Yes it’s straight to the point","selected":true,"score":10},{"value":"Need more description ","selected":false,"score":5},{"value":"Not too descriptive","selected":false,"score":0}],"selected":0},{"question":"Is the language / grammar correct?","answers":[{"value":"Yes","selected":true,"score":20},{"value":"A few mistakes","selected":false,"score":10},{"value":"It's pretty bad","selected":false,"score":0}],"selected":0},{"question":"Was the template followed?","answers":[{"value":"Yes","selected":true,"score":10},{"value":"Partially","selected":false,"score":5},{"value":"No","selected":false,"score":0}],"selected":0},{"question":"Is there information about the additional frameworks?","answers":[{"value":"Yes, everything is explained","selected":false,"score":5},{"value":"Yes, but not enough","selected":true,"score":3},{"value":"No details at all","selected":false,"score":0}],"selected":1},{"question":"Is there code in the tutorial?","answers":[{"value":"Yes, and it’s well explained","selected":true,"score":5},{"value":"Yes, but no explanation","selected":false,"score":3},{"value":"No","selected":false,"score":0}],"selected":0},{"question":"Is the tutorial explains technical aspects well enough?","answers":[{"value":"Yes, it teaches how and why about technical aspects","selected":true,"score":5},{"value":"Yes, but it’s not good/enough","selected":false,"score":3},{"value":"No, it explains poorly","selected":false,"score":0}],"selected":0},{"question":"Is the tutorial general and dense enough?","answers":[{"value":"Yes, it’s general and dense","selected":true,"score":5},{"value":"Kinda, it might be more generalized","selected":false,"score":3},{"value":"No, it’s sliced unnecessarily to keep part number high","selected":false,"score":0}],"selected":0},{"question":"Is there an outline for the tutorial content at the beginning of the post","answers":[{"value":"Yes, there is a well prepared outline in “What will I learn?” or another outline section","selected":true,"score":5},{"value":"Yes, but there is no proper listing for every step of the tutorial or it’s not detailed enough","selected":false,"score":3},{"value":"No, there is no outline for the steps.","selected":false,"score":0}],"selected":0},{"question":"Is the visual content of good quality?","answers":[{"value":"Yes","selected":true,"score":5},{"value":"Yes, but bad quality","selected":false,"score":3},{"value":"No","selected":false,"score":0}],"selected":0},{"question":"Is this a tutorial series?","answers":[{"value":"Yes","selected":false,"score":5},{"value":"Yes, but first part","selected":false,"score":3},{"value":"No","selected":true,"score":0}],"selected":2},{"question":"Is the tutorial post structured?","answers":[{"value":"Yes","selected":true,"score":5},{"value":"Not so good","selected":false,"score":3},{"value":"No","selected":false,"score":0}],"selected":0}],"score":74}" | ||||||
created | 2018-03-12 08:34:36 | ||||||
last_update | 2018-03-12 13:21:30 | ||||||
depth | 0 | ||||||
children | 5 | ||||||
last_payout | 2018-03-19 08:34:36 | ||||||
cashout_time | 1969-12-31 23:59:59 | ||||||
total_payout_value | 35.186 HBD | ||||||
curator_payout_value | 15.208 HBD | ||||||
pending_payout_value | 0.000 HBD | ||||||
promoted | 0.000 HBD | ||||||
body_length | 18,047 | ||||||
author_reputation | 1,390,724,167,302 | ||||||
root_title | "Extending the Forms Binding in Visual Studio" | ||||||
beneficiaries |
| ||||||
max_accepted_payout | 1,000,000.000 HBD | ||||||
percent_hbd | 10,000 | ||||||
post_id | 43,862,960 | ||||||
net_rshares | 19,447,015,900,507 | ||||||
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
yuxi | 0 | 7,096,085,133 | 40% | ||
thatmemeguy | 0 | 4,706,452,760 | 50% | ||
dyancuex | 0 | 956,203,644 | 50% | ||
toninux | 0 | 655,537,909 | 50% | ||
jdc | 0 | 739,739,321 | 20% | ||
mys | 0 | 9,653,324,536 | 12% | ||
walnut1 | 0 | 5,887,186,948 | 5% | ||
ilyastarar | 0 | 74,565,310,835 | 50% | ||
flauwy | 0 | 63,577,668,363 | 35% | ||
herman2141 | 0 | 137,874,600 | 50% | ||
alphacore | 0 | 2,409,200,363 | 5% | ||
mahdiyari | 0 | 11,367,119,649 | 20% | ||
ronimm | 0 | 14,214,408,258 | 100% | ||
mufasatoldyou | 0 | 7,650,082,427 | 100% | ||
sensation | 0 | 207,130,531 | 100% | ||
chaostheory | 0 | 945,063,914 | 100% | ||
butterfly-effect | 0 | 1,731,593,549 | 100% | ||
mirrorforce | 0 | 737,554,932 | 100% | ||
mysticalword | 0 | 830,903,652 | 100% | ||
simonluisi | 0 | 2,415,816,194 | 100% | ||
thinkkniht | 0 | 493,411,420 | 75% | ||
ewuoso | 0 | 28,315,936,589 | 20% | ||
elbleess | 0 | 770,832,804 | 50% | ||
jfuenmayor96 | 0 | 2,434,554,354 | 50% | ||
paradoxofchoice | 0 | 1,376,922,923 | 100% | ||
onos | 0 | 113,517,992 | 5% | ||
betacore | 0 | 1,642,409,683 | 100% | ||
planetenamek | 0 | 1,010,575,409 | 10% | ||
love-me | 0 | 1,092,116,520 | 100% | ||
drigweeu | 0 | 312,882,028 | 3% | ||
justdentist | 0 | 2,651,379,626 | 5% | ||
omegacore | 0 | 1,757,927,115 | 100% | ||
cifer | 0 | 4,725,162,690 | 80% | ||
jesdn16 | 0 | 2,617,760,641 | 100% | ||
xtramedium | 0 | 241,107,932 | 50% | ||
odibezeking | 0 | 357,491,262 | 100% | ||
stoodkev | 0 | 13,566,104,395 | 10% | ||
luisrod | 0 | 116,008,370 | 15% | ||
ansonoxy | 0 | 1,698,289,488 | 100% | ||
jamesbarraclough | 0 | 3,367,362,718 | 100% | ||
espoem | 0 | 23,134,922,427 | 40% | ||
superdavey | 0 | 157,871,020 | 2% | ||
timmyeu | 0 | 860,562,049 | 50% | ||
maxwell95 | 0 | 165,288,962 | 50% | ||
maaz23 | 0 | 630,616,978 | 50% | ||
isaganicabrales | 0 | 226,683,115 | 50% | ||
omersurer | 0 | 204,181,263 | 1% | ||
idlebright | 0 | 3,147,952,749 | 50% | ||
trabajadigital | 0 | 297,406,471 | 50% | ||
utopian-io | 0 | 18,963,145,365,794 | 12.41% | ||
steaknsteem | 0 | 1,874,288,969 | 50% | ||
abdullahall | 0 | 304,441,746 | 50% | ||
kimaben | 0 | 268,245,626 | 25% | ||
kslo | 0 | 2,411,714,126 | 50% | ||
mrmaracucho | 0 | 568,640,400 | 100% | ||
nathalie13 | 0 | 899,845,232 | 100% | ||
gutzygwin | 0 | 803,460,076 | 25% | ||
not-a-bird | 0 | 1,701,402,393 | 20% | ||
adhew | 0 | 61,532,000 | 10% | ||
bitopia | 0 | 1,444,462,479 | 100% | ||
eleonardo | 0 | 59,410,525 | 10% | ||
zohaib715 | 0 | 323,350,749 | 50% | ||
evilest-fiend | 0 | 2,388,887,844 | 100% | ||
azwarrangkuti | 0 | 7,328,543,647 | 100% | ||
brainiac01 | 0 | 567,549,218 | 100% | ||
reyha | 0 | 1,765,579,553 | 28% | ||
studytext | 0 | 151,004,014 | 25% | ||
damdap | 0 | 217,670,853 | 50% | ||
iqbaladan | 0 | 3,252,541,412 | 100% | ||
checkthisout | 0 | 821,476,271 | 50% | ||
navx | 0 | 2,031,197,591 | 70% | ||
handfree42 | 0 | 217,836,015 | 50% | ||
ilovekrys | 0 | 218,696,430 | 50% | ||
family.app | 0 | 103,452,166 | 100% | ||
varja | 0 | 496,471,818 | 50% | ||
maphics | 0 | 103,115,225 | 100% | ||
dethclad | 0 | 1,485,481,327 | 50% | ||
sebastiengllmt | 0 | 303,438,571 | 50% | ||
kolaolabode | 0 | 289,418,852 | 50% | ||
utopian-1up | 0 | 18,198,545,993 | 100% | ||
odesanya | 0 | 58,190,422 | 10% | ||
luoq | 0 | 8,852,678,639 | 50% | ||
senseibabs | 0 | 85,965,613 | 20% | ||
carsonroscoe | 0 | 5,768,535,312 | 50% | ||
zlatkamrs | 0 | 392,612,551 | 70% | ||
amosbastian | 0 | 10,378,367,467 | 50% | ||
bobsthinking | 0 | 4,611,276,500 | 100% | ||
acrywhif | 0 | 3,338,033,453 | 80% | ||
xplore | 0 | 478,861,703 | 50% | ||
layanmarissa | 0 | 221,846,146 | 50% | ||
proffgodswill | 0 | 61,299,229 | 10% | ||
sweeverdev | 0 | 1,052,002,634 | 50% | ||
isacastillor | 0 | 1,262,570,964 | 95% | ||
devilonwheels | 0 | 1,793,141,628 | 10% | ||
rhotimee | 0 | 5,448,181,399 | 50% | ||
jrmiller87 | 0 | 2,493,451,815 | 100% | ||
solomon507 | 0 | 501,515,610 | 50% | ||
patatesyiyen | 0 | 81,722,479 | 12.5% | ||
deejee | 0 | 119,510,642 | 20% | ||
rsteem | 0 | 115,335,115 | 50% | ||
onin91 | 0 | 437,308,890 | 50% | ||
isabella394 | 0 | 2,485,922,576 | 100% | ||
sanyjaya | 0 | 421,191,294 | 100% | ||
emailbox19149 | 0 | 156,196,115 | 50% | ||
deril | 0 | 64,330,866 | 20% | ||
skybreaker | 0 | 1,511,865,631 | 100% | ||
lemony-cricket | 0 | 10,550,790,911 | 20% | ||
rayday | 0 | 498,502,560 | 100% | ||
shuta | 0 | 1,474,767,210 | 50% | ||
yeswanth | 0 | 613,361,162 | 100% | ||
kaking | 0 | 223,576,503 | 50% | ||
exploreand | 0 | 6,118,636,557 | 25% | ||
blaize-eu | 0 | 1,208,585,794 | 90% | ||
petvalbra | 0 | 604,525,010 | 100% | ||
hmctrasher | 0 | 386,414,991 | 10% | ||
photohunter2 | 0 | 102,540,086 | 100% | ||
photohunter3 | 0 | 99,604,162 | 100% | ||
photohunter4 | 0 | 84,986,416 | 100% | ||
photohunter5 | 0 | 82,487,898 | 100% | ||
josh26 | 0 | 72,219,286 | 10% | ||
howtosteem | 0 | 3,776,840,937 | 100% | ||
sylinda | 0 | 214,434,143 | 50% | ||
jbeguna04 | 0 | 449,041,613 | 50% | ||
fmbs25 | 0 | 287,457,318 | 50% | ||
livsky | 0 | 368,234,564 | 50% | ||
badmusazeez | 0 | 98,010,057 | 50% | ||
roj | 0 | 1,560,780,604 | 100% | ||
alfiannurmedia | 0 | 135,506,212 | 100% | ||
aderemi01 | 0 | 1,087,663,689 | 50% | ||
teamsarcasm | 0 | 566,952,503 | 100% | ||
supreme-verdict | 0 | 19,975,518,785 | 100% | ||
steemnova | 0 | 653,156,214 | 12% | ||
retrocausality | 0 | 1,046,230,254 | 100% | ||
killbill73 | 0 | 159,273,797 | 50% | ||
amirdesaingrafis | 0 | 298,566,582 | 50% | ||
fai.zul | 0 | 298,786,016 | 50% | ||
nightdragon | 0 | 162,064,409 | 50% | ||
anof | 0 | 209,166,975 | 50% | ||
reazuliqbal | 0 | 1,980,525,529 | 100% | ||
aliyu-s | 0 | 341,623,036 | 50% | ||
rhema | 0 | 568,992,943 | 100% | ||
flinter | 0 | 168,560,850 | 50% | ||
opulence | 0 | 1,796,999,533 | 50% | ||
yox | 0 | 8,160,995,559 | 100% | ||
monster-reborn | 0 | 130,519,920 | 100% | ||
crispycoinboys | 0 | 1,868,162,949 | 30% | ||
gwapoaller | 0 | 300,169,849 | 50% | ||
bluestorm | 0 | 459,735,758 | 75% | ||
mosesogenyi | 0 | 214,384,662 | 50% | ||
pepememes | 0 | 187,817,037 | 50% | ||
chain-reaction | 0 | 110,280,898 | 100% | ||
animesukidesu | 0 | 183,949,611 | 50% | ||
megalithic | 0 | 1,710,029,040 | 5% | ||
esme-svh | 0 | 239,431,262 | 50% | ||
derasmo | 0 | 461,775,355 | 50% | ||
flugbot | 0 | 122,643,184 | 100% | ||
lemcriq | 0 | 57,226,213 | 20% | ||
steemlore | 0 | 102,168,698 | 50% | ||
truthtrader | 0 | 410,747,284 | 50% |
<center>http://res.cloudinary.com/duvrfxmpc/image/upload/v1507109534/1-Year_wj6rbu.jpg<h1>Congratulation</h1><b>Today one year ago you joined SteemIt Thank you, for making SteemIt great and Steem on for more years to come!</b> (You are being celebrated [here](/steemit/@anniversary/20180313t030020765z-celebration-post))<br/></center>
author | anniversary |
---|---|
permlink | 20180313t031828874z |
category | utopian-io |
json_metadata | {"tags":["comment"],"app":"steemjs/comment"} |
created | 2018-03-13 03:18:33 |
last_update | 2018-03-13 03:18:33 |
depth | 1 |
children | 0 |
last_payout | 2018-03-20 03:18:33 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 339 |
author_reputation | 1,856,978,117,082 |
root_title | "Extending the Forms Binding in Visual Studio" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 44,042,226 |
net_rshares | 0 |
Awesome! Nice post yissakhar<br><br>Your article is well written, and I will continue to pay attention to you.<br>I want to ask you how to do this steemit? <br><br>What do you do to make your steemit get such a high income? <br>Sincerely ask for you, thank you!<br><br>If u want check my article about Price of 20 SBD/60USD: 7 World's Continents photo challenge WEEKLY WINNER announcement <br>You can find the article here <a href="http://bit.ly/2DpSLJt " >Price of 20 SBD/60USD: 7 World's Continents photo challenge WEEKLY WINNER announcement</a><br><br>I will follow you yissakhar<br>
author | bishal3690 |
---|---|
permlink | re-extending-the-forms-binding-in-visual-studio-900 |
category | utopian-io |
json_metadata | "" |
created | 2018-03-14 09:30:15 |
last_update | 2018-03-14 09:30:15 |
depth | 1 |
children | 0 |
last_payout | 2018-03-21 09:30:15 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 586 |
author_reputation | -680,028,907,003 |
root_title | "Extending the Forms Binding in Visual Studio" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 44,331,987 |
net_rshares | 0 |
Thank you for the contribution. It has been approved. - Why not add more sreenshot about your operation You can contact us on [Discord](https://discord.gg/uTyJkNm). **[[utopian-moderator]](https://utopian.io/moderators)**
author | cha0s0000 |
---|---|
permlink | re-yissakhar-extending-the-forms-binding-in-visual-studio-20180312t132200949z |
category | utopian-io |
json_metadata | {"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"} |
created | 2018-03-12 13:22:00 |
last_update | 2018-03-12 13:22:00 |
depth | 1 |
children | 1 |
last_payout | 2018-03-19 13:22:00 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.949 HBD |
curator_payout_value | 0.235 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 224 |
author_reputation | 30,983,518,016,225 |
root_title | "Extending the Forms Binding in Visual Studio" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 43,906,223 |
net_rshares | 384,384,017,340 |
author_curate_reward | "" |
voter | weight | wgt% | rshares | pct | time |
---|---|---|---|---|---|
utopian.tip | 0 | 384,384,017,340 | 36.67% |
Hey @cha0s0000, I just gave you a tip for your hard work on moderation. Upvote this comment to support the utopian moderators and increase your future rewards!
author | utopian.tip |
---|---|
permlink | re-re-yissakhar-extending-the-forms-binding-in-visual-studio-20180312t132200949z-20180312t134615 |
category | utopian-io |
json_metadata | "" |
created | 2018-03-12 13:46:18 |
last_update | 2018-03-12 13:46:18 |
depth | 2 |
children | 0 |
last_payout | 2018-03-19 13:46:18 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 159 |
author_reputation | 238,310,597,885 |
root_title | "Extending the Forms Binding in Visual Studio" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 43,910,707 |
net_rshares | 0 |
### Hey @yissakhar I am @utopian-io. I have just upvoted you! #### Achievements - WOW WOW WOW People loved what you did here. GREAT JOB! - You have less than 500 followers. Just gave you a gift to help you succeed! - Seems like you contribute quite often. AMAZING! #### Community-Driven Witness! I am the first and only Steem Community-Driven Witness. <a href="https://discord.gg/zTrEMqB">Participate on Discord</a>. Lets GROW TOGETHER! - <a href="https://v2.steemconnect.com/sign/account-witness-vote?witness=utopian-io&approve=1">Vote for my Witness With SteemConnect</a> - <a href="https://v2.steemconnect.com/sign/account-witness-proxy?proxy=utopian-io&approve=1">Proxy vote to Utopian Witness with SteemConnect</a> - Or vote/proxy on <a href="https://steemit.com/~witnesses">Steemit Witnesses</a> [](https://steemit.com/~witnesses) **Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x**
author | utopian-io |
---|---|
permlink | re-yissakhar-extending-the-forms-binding-in-visual-studio-20180313t085703483z |
category | utopian-io |
json_metadata | {"tags":["utopian-io"],"community":"utopian","app":"utopian/1.0.0"} |
created | 2018-03-13 08:57:03 |
last_update | 2018-03-13 08:57:03 |
depth | 1 |
children | 0 |
last_payout | 2018-03-20 08:57:03 |
cashout_time | 1969-12-31 23:59:59 |
total_payout_value | 0.000 HBD |
curator_payout_value | 0.000 HBD |
pending_payout_value | 0.000 HBD |
promoted | 0.000 HBD |
body_length | 1,142 |
author_reputation | 152,955,367,999,756 |
root_title | "Extending the Forms Binding in Visual Studio" |
beneficiaries | [] |
max_accepted_payout | 1,000,000.000 HBD |
percent_hbd | 10,000 |
post_id | 44,095,038 |
net_rshares | 0 |