Modified:
trunk/MySql.VisualStudio/DbObjects/ForeignKey.cs
trunk/MySql.VisualStudio/DbObjects/Table.cs
trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.Designer.cs
trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.cs
trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.resx
trunk/MySql.VisualStudio/Editors/IndexColumnEditorDialog.cs
trunk/MySql.VisualStudio/Properties/Resources.Designer.cs
trunk/MySql.VisualStudio/Properties/Resources.resx
Log:
got foreign key editor dialog working mostly the way I want it to. Both it and the index column editor dialog close for no apparent reason. I still have to figure out what is wrong there.
Modified: trunk/MySql.VisualStudio/DbObjects/ForeignKey.cs
===================================================================
--- trunk/MySql.VisualStudio/DbObjects/ForeignKey.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/DbObjects/ForeignKey.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -10,6 +10,7 @@
{
Table = t;
SetName(String.Format("FK_{0}_{0}", t.Name), true);
+ Columns = new List<FKColumnPair>();
}
private Table Table { get; set; }
@@ -18,7 +19,7 @@
public MatchOption Match { get; set; }
public ReferenceOption UpdateAction { get; set; }
public ReferenceOption DeleteAction { get; set; }
- List<FKColumnPair> Columns { get; set; }
+ public List<FKColumnPair> Columns { get; set; }
public override string ToString()
{
@@ -60,9 +61,9 @@
NoAction, Cascade, Restrict, SetNull
}
- struct FKColumnPair
+ class FKColumnPair
{
- public string parentTable;
- public string childTable;
+ public string ParentTable { get; set; }
+ public string ChildTable { get; set; }
}
}
Modified: trunk/MySql.VisualStudio/DbObjects/Table.cs
===================================================================
--- trunk/MySql.VisualStudio/DbObjects/Table.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/DbObjects/Table.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -215,13 +215,6 @@
}
}
- private bool KeyExists(string keyName)
- {
- foreach (Index i in indexes)
- if (String.Compare(i.Name, keyName, true) == 0) return true;
- return false;
- }
-
public Index CreateIndexWithUniqueName(bool primary)
{
Index newIndex = new Index(this);
@@ -236,6 +229,43 @@
return newIndex;
}
+ public List<string> GetColumnNames()
+ {
+ string sql = @"SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE
+ TABLE_SCHEMA='{0}' AND TABLE_NAME='{1}'";
+ DataTable dt = owningNode.GetDataTable(String.Format(sql, owningNode.Database, Name));
+ List<string> cols =new List<string>();
+ foreach (DataRow row in dt.Rows)
+ cols.Add(row[0].ToString());
+ return cols;
+ }
+
+ public string GetSql(Table fromTable)
+ {
+
+ StringBuilder sql = new StringBuilder();
+ if (isNew)
+ sql.AppendFormat("CREATE TABLE `{0}` (", Name);
+ else
+ sql.AppendFormat("ALTER TABLE `{0}` ", fromTable.Name);
+
+ // foreach (Column c in Columns)
+ // sql.Append(c.GetSql(), IsNew);
+
+ if (isNew) sql.Append(") ");
+ sql.Append(GetTableOptionSql(fromTable));
+ return sql.ToString();
+ }
+
+ #region Private methods
+
+ private bool KeyExists(string keyName)
+ {
+ foreach (Index i in indexes)
+ if (String.Compare(i.Name, keyName, true) == 0) return true;
+ return false;
+ }
+
private void ParseTableData(DataRow tableRow)
{
/* dt.Columns.Add("TABLE_TYPE", typeof(string));
@@ -294,23 +324,6 @@
}
}
- public string GetSql(Table fromTable)
- {
-
- StringBuilder sql = new StringBuilder();
- if (isNew)
- sql.AppendFormat("CREATE TABLE `{0}` (", Name);
- else
- sql.AppendFormat("ALTER TABLE `{0}` ", fromTable.Name);
-
-// foreach (Column c in Columns)
- // sql.Append(c.GetSql(), IsNew);
-
- if (isNew) sql.Append(") ");
- sql.Append(GetTableOptionSql(fromTable));
- return sql.ToString();
- }
-
private string GetTableOptionSql(Table fromTable)
{
StringBuilder sql = new StringBuilder();
@@ -335,6 +348,8 @@
return sql.ToString();
}
+ #endregion
+
#region ICustomTypeDescriptor Members
public TypeConverter GetConverter()
Modified: trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.Designer.cs
===================================================================
--- trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.Designer.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.Designer.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -42,6 +42,7 @@
this.columnGrid = new System.Windows.Forms.DataGridView();
this.colGridColumn = new System.Windows.Forms.DataGridViewComboBoxColumn();
this.fkGridColumn = new System.Windows.Forms.DataGridViewComboBoxColumn();
+ this.fkColumnsBindingSource = new System.Windows.Forms.BindingSource(this.components);
this.closeButton = new System.Windows.Forms.Button();
this.label5 = new System.Windows.Forms.Label();
this.fkName = new System.Windows.Forms.TextBox();
@@ -56,6 +57,7 @@
this.refTable = new MySql.Data.VisualStudio.Editors.MyComboBox();
((System.ComponentModel.ISupportInitialize)(this.foreignKeyBindingSource)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.columnGrid)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.fkColumnsBindingSource)).BeginInit();
this.SuspendLayout();
//
// fkList
@@ -66,11 +68,11 @@
this.fkList.Name = "fkList";
this.fkList.Size = new System.Drawing.Size(181, 304);
this.fkList.TabIndex = 0;
- this.fkList.SelectedIndexChanged += new System.EventHandler(this.fkList_SelectedIndexChanged);
//
// foreignKeyBindingSource
//
this.foreignKeyBindingSource.AllowNew = false;
+ this.foreignKeyBindingSource.CurrentChanged += new System.EventHandler(this.foreignKeyBindingSource_CurrentChanged);
//
// label1
//
@@ -124,6 +126,7 @@
// columnGrid
//
this.columnGrid.AllowUserToResizeRows = false;
+ this.columnGrid.AutoGenerateColumns = false;
this.columnGrid.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.columnGrid.BackgroundColor = System.Drawing.SystemColors.Window;
this.columnGrid.BorderStyle = System.Windows.Forms.BorderStyle.None;
@@ -132,7 +135,7 @@
this.columnGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.colGridColumn,
this.fkGridColumn});
- this.columnGrid.Enabled = false;
+ this.columnGrid.DataSource = this.fkColumnsBindingSource;
this.columnGrid.GridColor = System.Drawing.SystemColors.ControlLight;
this.columnGrid.Location = new System.Drawing.Point(218, 163);
this.columnGrid.MultiSelect = false;
@@ -142,9 +145,13 @@
this.columnGrid.ShowEditingIcon = false;
this.columnGrid.Size = new System.Drawing.Size(425, 177);
this.columnGrid.TabIndex = 10;
+ this.columnGrid.RowValidating += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.columnGrid_RowValidating);
+ this.columnGrid.CellValidating += new System.Windows.Forms.DataGridViewCellValidatingEventHandler(this.columnGrid_CellValidating);
+ this.columnGrid.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.columnGrid_EditingControlShowing);
//
// colGridColumn
//
+ this.colGridColumn.DataPropertyName = "parentTable";
this.colGridColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.Nothing;
this.colGridColumn.DisplayStyleForCurrentCellOnly = true;
this.colGridColumn.HeaderText = "Column";
@@ -152,11 +159,17 @@
//
// fkGridColumn
//
+ this.fkGridColumn.DataPropertyName = "childTable";
this.fkGridColumn.DisplayStyle = System.Windows.Forms.DataGridViewComboBoxDisplayStyle.ComboBox;
this.fkGridColumn.DisplayStyleForCurrentCellOnly = true;
this.fkGridColumn.HeaderText = "Foreign Column";
this.fkGridColumn.Name = "fkGridColumn";
//
+ // fkColumnsBindingSource
+ //
+ this.fkColumnsBindingSource.AllowNew = true;
+ this.fkColumnsBindingSource.DataSource = typeof(MySql.Data.VisualStudio.DbObjects.FKColumnPair);
+ //
// closeButton
//
this.closeButton.Location = new System.Drawing.Point(556, 347);
@@ -322,6 +335,7 @@
this.Text = "Foreign Key Relationships";
((System.ComponentModel.ISupportInitialize)(this.foreignKeyBindingSource)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.columnGrid)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.fkColumnsBindingSource)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -348,8 +362,9 @@
private System.Windows.Forms.Label label6;
private MyComboBox matchType;
private System.Windows.Forms.Label label7;
- private System.Windows.Forms.DataGridViewComboBoxColumn colGridColumn;
- private System.Windows.Forms.DataGridViewComboBoxColumn fkGridColumn;
private System.Windows.Forms.BindingSource foreignKeyBindingSource;
+ private BindingSource fkColumnsBindingSource;
+ private DataGridViewComboBoxColumn colGridColumn;
+ private DataGridViewComboBoxColumn fkGridColumn;
}
}
\ No newline at end of file
Modified: trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.cs
===================================================================
--- trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -7,12 +7,16 @@
using System.Windows.Forms;
using MySql.Data.VisualStudio.DbObjects;
using System.Collections;
+using MySql.Data.VisualStudio.Properties;
namespace MySql.Data.VisualStudio.Editors
{
partial class ForeignKeyDialog : Form
{
TableNode tableNode;
+ List<string> columnNames = new List<string>();
+ List<string> fkColumnNames = new List<string>();
+ const string None = "<None>";
public ForeignKeyDialog(TableNode node)
{
@@ -31,6 +35,13 @@
refTable.DataSource = tables;
colGridColumn.HeaderText = tableNode.Table.Name;
+ colGridColumn.Items.Add(None);
+ foreach (Column c in tableNode.Table.Columns)
+ {
+ if (c.ColumnName == null) continue;
+ columnNames.Add(c.ColumnName);
+ colGridColumn.Items.Add(c.ColumnName);
+ }
foreignKeyBindingSource.DataSource = tableNode.Table.ForeignKeys;
fkList.DataSource = foreignKeyBindingSource;
@@ -41,66 +52,47 @@
Close();
}
- private void fkList_SelectedIndexChanged(object sender, EventArgs e)
- {
- //foreignKeyBindingSource.Position = fkList.SelectedIndex;
-/* bool good = fkList.SelectedIndex != -1;
- deleteButton.Enabled = good;
- if (!good) return;
-
- ForeignKey key = tableNode.Table.ForeignKeys[fkList.SelectedIndex];
- fkName.Text = key.Name;
- updateAction.SelectedValue = key.UpdateAction;
- deleteAction.SelectedValue = key.DeleteAction;
- refTable.Items.Clear();
- foreach (string table in tables)
- if (String.Compare(table, tableNode.Table.Name, true) != 0)
- refTable.Items.Add(table);
- refTable.SelectedValue = key.ReferencedTable;*/
- }
-
private void addButton_Click(object sender, EventArgs e)
{
ForeignKey key = new ForeignKey(tableNode.Table);
+ if (refTable.SelectedValue != null)
+ key.SetName(String.Format("FK_{0}_{1}", tableNode.Table.Name,
+ refTable.SelectedValue), true);
foreignKeyBindingSource.Add(key);
}
- private void ClearControls()
- {
- fkName.Text = String.Empty;
- refTable.SelectedIndex = -1;
- updateAction.SelectedIndex = -1;
- deleteAction.SelectedIndex = -1;
- matchType.SelectedIndex = -1;
- columnGrid.Rows.Clear();
- fkGridColumn.HeaderText = String.Empty;
- }
-
private void deleteButton_Click(object sender, EventArgs e)
{
- tableNode.Table.ForeignKeys.RemoveAt(fkList.SelectedIndex);
- int index = fkList.SelectedIndex;
- fkList.Items.RemoveAt(index);
- index--;
- if (index == -1 && fkList.Items.Count > 0)
- fkList.SelectedIndex = 0;
- else if (index > -1)
- fkList.SelectedIndex = index;
-
- if (fkList.SelectedIndex == -1)
- ClearControls();
+ foreignKeyBindingSource.RemoveCurrent();
}
private void refTable_SelectedIndexChanged(object sender, EventArgs e)
{
string refTableName = refTable.Items[refTable.SelectedIndex].ToString();
fkGridColumn.HeaderText = refTableName;
+
+ //reset the items list for the fk column
+ string sql = @"SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE
+ TABLE_SCHEMA='{0}' AND TABLE_NAME='{1}'";
+ DataTable dt = tableNode.GetDataTable(String.Format(sql, tableNode.Database, refTableName));
+ fkColumnNames.Clear();
+ foreach (DataRow row in dt.Rows)
+ fkColumnNames.Add(row[0].ToString());
+
+ fkGridColumn.Items.Clear();
+ fkGridColumn.Items.Add(None);
+ foreach (string col in fkColumnNames)
+ fkGridColumn.Items.Add(col);
+
if (foreignKeyBindingSource.Current == null) return;
+ // update the key name if it is not already finalized
ForeignKey key = foreignKeyBindingSource.Current as ForeignKey;
- if (key.NameSet) return;
- string name = String.Format("FK_{0}_{1}", tableNode.Table.Name, refTableName);
- key.SetName(name, true);
+ if (!key.NameSet)
+ {
+ string name = String.Format("FK_{0}_{1}", tableNode.Table.Name, refTableName);
+ key.SetName(name, true);
+ }
}
private void fkName_KeyPress(object sender, KeyPressEventArgs e)
@@ -108,5 +100,109 @@
ForeignKey key = foreignKeyBindingSource.Current as ForeignKey;
key.NameSet = true;
}
+
+ private void columnGrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
+ {
+ Type t = e.Control.GetType();
+ if (t != typeof(DataGridViewComboBoxEditingControl)) return;
+
+ DataGridViewComboBoxEditingControl ec = e.Control as DataGridViewComboBoxEditingControl;
+ ec.DrawMode = DrawMode.OwnerDrawFixed;
+ ec.DrawItem += new DrawItemEventHandler(dropdown_DrawItem);
+
+ // now update the items that should be seen in this control
+ ec.Items.Clear();
+ ec.Items.Add(None);
+ int index = columnGrid.CurrentCell.ColumnIndex;
+ List<string> cols = index == 0 ? columnNames : fkColumnNames;
+ ForeignKey key = foreignKeyBindingSource.Current as ForeignKey;
+
+ foreach (string s in cols)
+ {
+ bool alreadyUsed = false;
+ if (s != (string)columnGrid.CurrentCell.Value)
+ foreach (FKColumnPair pair in key.Columns)
+ if ((index == 0 && pair.ParentTable == s) ||
+ (index == 1 && pair.ChildTable == s))
+ {
+ alreadyUsed = true;
+ break;
+ }
+ if (!alreadyUsed)
+ ec.Items.Add(s);
+ }
+ int selIndex = ec.FindStringExact(columnGrid.CurrentCell.Value as string);
+ if (selIndex > 0)
+ ec.SelectedIndex = selIndex;
+ }
+
+ void dropdown_DrawItem(object sender, DrawItemEventArgs e)
+ {
+ MyComboBox.DrawComboBox(sender as ComboBox, e);
+ }
+
+ private void foreignKeyBindingSource_CurrentChanged(object sender, EventArgs e)
+ {
+ if (foreignKeyBindingSource.Current == null)
+ {
+ columnGrid.Rows.Clear();
+ return;
+ }
+ ForeignKey key = foreignKeyBindingSource.Current as ForeignKey;
+ fkColumnsBindingSource.DataSource = key.Columns;
+ }
+
+ private void columnGrid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
+ {
+ int index = e.ColumnIndex;
+ DataGridViewComboBoxCell cell =
+ (DataGridViewComboBoxCell)columnGrid.Rows[e.RowIndex].Cells[e.ColumnIndex];
+
+ FKColumnPair pair = fkColumnsBindingSource.Current as FKColumnPair;
+ string value = e.FormattedValue as string;
+
+ if (value == None)
+ {
+ cell.Value = null;
+ if (index == 0)
+ pair.ParentTable = null;
+ else
+ pair.ChildTable = null;
+ }
+ else
+ cell.Value = e.FormattedValue as string;
+ }
+
+ private void columnGrid_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
+ {
+ int index = e.RowIndex;
+
+ DataGridViewCell parentCell = columnGrid.Rows[e.RowIndex].Cells[0];
+ DataGridViewCell childCell = columnGrid.Rows[e.RowIndex].Cells[1];
+ string parent = parentCell.Value as string;
+ string child = childCell.Value as string;
+
+ bool bad = false;
+ parentCell.ErrorText = childCell.ErrorText = null;
+
+ if ((String.IsNullOrEmpty(parent) || parent == None) &&
+ (!String.IsNullOrEmpty(child) && child != None))
+ {
+ parentCell.ErrorText = Resources.FKNeedColumn;
+ bad = true;
+ }
+ else if ((String.IsNullOrEmpty(child) || child == None) &&
+ (!String.IsNullOrEmpty(parent) && parent != None))
+ {
+ childCell.ErrorText = Resources.FKNeedColumn;
+ bad = true;
+ }
+ if (bad)
+ {
+ MessageBox.Show(Resources.FKColumnsNotMatched, null, MessageBoxButtons.OK, MessageBoxIcon.Information);
+ e.Cancel = true;
+ return;
+ }
+ }
}
}
Modified: trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.resx
===================================================================
--- trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.resx 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Editors/ForeignKeyDialog.resx 2008-12-15 21:55:25 UTC (rev 1488)
@@ -126,4 +126,7 @@
<metadata name="fkGridColumn.UserAddedColumn" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
+ <metadata name="fkColumnsBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>206, 17</value>
+ </metadata>
</root>
\ No newline at end of file
Modified: trunk/MySql.VisualStudio/Editors/IndexColumnEditorDialog.cs
===================================================================
--- trunk/MySql.VisualStudio/Editors/IndexColumnEditorDialog.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Editors/IndexColumnEditorDialog.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -48,7 +48,6 @@
Type t = e.Control.GetType();
if (t != typeof(DataGridViewComboBoxEditingControl)) return;
- System.Diagnostics.Trace.WriteLine("EditControlShowing starting");
DataGridViewComboBoxEditingControl ec = e.Control as DataGridViewComboBoxEditingControl;
ec.DrawMode = DrawMode.OwnerDrawFixed;
ec.DrawItem += new DrawItemEventHandler(dropdown_DrawItem);
@@ -75,15 +74,12 @@
int index = ec.FindStringExact(indexGrid.CurrentRow.Cells[0].Value as string);
if (index > 0)
ec.SelectedIndex = index;
- System.Diagnostics.Trace.WriteLine("EditControlShowing_leaving");
}
}
void dropdown_DrawItem(object sender, DrawItemEventArgs e)
{
- System.Diagnostics.Trace.WriteLine("DrawItem starting");
MyComboBox.DrawComboBox(sender as ComboBox, e);
- System.Diagnostics.Trace.WriteLine("DrawItem leaving");
}
private void okButton_Click(object sender, EventArgs e)
@@ -120,7 +116,6 @@
gr.SortOrder = "Ascending";
sortCell.Value = gr.SortOrder;
}
- System.Diagnostics.Trace.WriteLine("Validating leaving");
}
private void cancelButton_Click(object sender, EventArgs e)
Modified: trunk/MySql.VisualStudio/Properties/Resources.Designer.cs
===================================================================
--- trunk/MySql.VisualStudio/Properties/Resources.Designer.cs 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Properties/Resources.Designer.cs 2008-12-15 21:55:25 UTC (rev 1488)
@@ -2423,6 +2423,24 @@
}
}
+ /// <summary>
+ /// Looks up a localized string similar to Both sides of a relationship must have the same number of columns..
+ /// </summary>
+ public static string FKColumnsNotMatched {
+ get {
+ return ResourceManager.GetString("FKColumnsNotMatched", resourceCulture);
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized string similar to Expected column name..
+ /// </summary>
+ public static string FKNeedColumn {
+ get {
+ return ResourceManager.GetString("FKNeedColumn", resourceCulture);
+ }
+ }
+
public static System.Drawing.Bitmap Key {
get {
object obj = ResourceManager.GetObject("Key", resourceCulture);
Modified: trunk/MySql.VisualStudio/Properties/Resources.resx
===================================================================
--- trunk/MySql.VisualStudio/Properties/Resources.resx 2008-12-15 18:47:08 UTC (rev 1487)
+++ trunk/MySql.VisualStudio/Properties/Resources.resx 2008-12-15 21:55:25 UTC (rev 1488)
@@ -1044,4 +1044,10 @@
<data name="Key" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Key.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="FKColumnsNotMatched" xml:space="preserve">
+ <value>Both sides of a relationship must have the same number of columns.</value>
+ </data>
+ <data name="FKNeedColumn" xml:space="preserve">
+ <value>Expected column name.</value>
+ </data>
</root>
\ No newline at end of file
| Thread |
|---|
| • Connector/NET commit: r1488 - in trunk/MySql.VisualStudio: DbObjects Editors Properties | rburnett | 15 Dec |