StackPanel、エキスパンダー、テキストボックス、およびいくつかのボタンがあります。例えばボタンと同じコントロールのコントロールから値を取得
私は次のような構造を持っている:私は、ボタンがクリックされたエクスパンダからtextbox.Textを取得できますか
StackPanel
Expander 1
TextBox 1
Button 1
Expander 2
TextBox 2
Button 2
Expander 3
TextBox 3
Button 3
?
たとえば、Button 2をクリックして、Expander 2でTextBox 2を取得したいとします。 すべてのコントロールは、StackPanelの代わりにプログラムで追加されます。
イベントのようなものがありますか?同じエキスパンダーでボタンをクリックしたときにテキストボックスを取得する方法がわかりません。
エクスパンダーヘッダーとその内容(例:テキストボックス値)を保存する2つのメソッドが必要です。
第1の方法は、Expander's Headerを右クリックして、ヘッダーをTextBoxに変換してテキストを編集できるようにすることです。 ENTERをクリックすると、TextBox.TextがTextBlockに保存されます。どちらがうまくいくの?しかし、私はボタンのために同じコードを使用することはできません。
Expander editable_expander; // Expander sender from Expander_MouseRightButtonDown
private void Expander_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var ex = sender as Expander;
TextBox tb = new TextBox();
tb.Text = ex.Header.ToString();
tb.KeyUp += TextBox_KeyUp;
ex.Header = tb;
editable_expander = ex;
}
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
// Edit Columnname of selected Column when Enter pressed
if (e.Key != Key.Enter) return;
var tb = sender as TextBox;
e.Handled = true;
string old_expander_name = editable_expander.Name.ToString();
string old_column_name = old_expander_name.Split('_')[0];
int length = 0;
string type = "";
if(OpenConnection() == true)
{
try
{
Grid grid = editable_expander.Content as Grid;
List<StackPanel> stackpanel = grid.Children.OfType<StackPanel>().ToList();
for(int i = 1; i < 2; i++)
{
StackPanel sp = stackpanel[i];
List<TextBox> textbox = sp.Children.OfType<TextBox>().ToList();
for(int j = 0; j < textbox.Count; j++)
{
TextBox tb1 = textbox[j];
length = Convert.ToInt32(tb1.Text);
}
List<ComboBox> combobox = sp.Children.OfType<ComboBox>().ToList();
for(int k = 0; k < combobox.Count; k++)
{
ComboBox cb = combobox[k];
type = cb.Text;
}
}
string query = "ALTER TABLE " + editable_expander.Tag + " CHANGE " + old_column_name + " " + tb.Text + " " + type + "(" + length + ")";
MySqlCommand cmd = new MySqlCommand(query, connection);
cmd.ExecuteNonQuery();
}
catch (MySqlException ex)
{
MessageBox.Show(ex.Message);
}
}
editable_expander.Header = tb.Text;
}
保存する方法は2つあります。 1がエキスパンダヘッダを右クリックすると、ヘッダがテキストボックスに変換されます。 Enterキーを押すと保存され、TextBlockに戻ります。私は私のトピックでこのメソッドを追加します。しかし、私はテキストボックスイベントで働いているので、私はボタンクリックイベントでこれをもう一度することはできないと思います –
Googleのいくつかのもの..."WPF get parent control"や "WPF get specific child control"のように。 – musefan
私はそれぞれのExpander情報のviewmodelを見たいと思うと思います。こうすることで、プロジェクト全体がコードビハインドで記述されているため、コードアンダーラインで作業しているExpander – kenny