-1

MainForm と AnotherForm があります。AnotherForm は、MainForm の menuItem を介してアクセスされます。

AnotherForm には listView があります。ユーザーがアイテムをクリックすると、文字列要素を取得して MainForm のテキスト ボックスに渡したいので、要素がそこに表示され、AnotherForm が閉じられます。これまでのところ、AnotherForm は閉じますが、MainForm のテキスト ボックスには何も表示されません。助言がありますか?

private void listView1_ItemActivate(object sender, EventArgs e)
{
    string input = listView1.SelectedItem[0].ToString();
    MainForm mainF = new MainForm(input);// called the constructor
    this.Close(); //close this form and pass the input to MainForm
    mainF.inputTextBox.Text = input;
    mainF.loadThis(input);
}
4

3 に答える 3

0

この提示されたソリューションでは、やりたいことを達成するために、次の 5 つの主なことができます。

 1) Declare a global object for AnotherForm in MainForm
 2) Initiate a FromClosing event handler for AnotherForm in MainForm
 3) Make a public property or field in AnotherForm
 4) Before closing in AnotherForm you save it the public property mentioned above
 5) In the MainForm get the public property from AnotherForm

コードは次のとおりです。

メインフォーム

public partial class MainForm : Form
{
    AnotherForm anotherForm; // Declare a global object for AnotherForm

    public MainForm()
    {
        InitializeComponent();
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e)
    {
        anotherForm = new AnotherForm(); // when Menu Item is clicked instantiate the Form
        anotherForm.FormClosing += new FormClosingEventHandler(anotherForm_FormClosing); // Add a FormClosing event Handler
        anotherForm.ShowDialog();
    }

    void anotherForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        inputTextBox.Text = anotherForm.listViewValue; // get the Value from public property in AnotherForm
    }
}

アナザーフォーム

 void listView1_ItemActivate(object sender, EventArgs e)
 {
    listViewValue = listView1.SelectedItems[0].Text; // Get the listViewItem value and save to public property
    this.Close(); // Close
 }

 public String listViewValue { get; set; } // public property to store the ListView value

ToString()で使用しなかったコードと比較して、ここで注意すべきことが 1 つありますListView.SelectedItems

listView1.SelectedItems[0].ToString();

ただし、代わりにTextプロパティを使用します。

listView1.SelectedItems[0].Text;
于 2013-11-02T02:30:46.347 に答える
0

のインスタンスがMainForm既にあると仮定し、それが のインスタンスを作成しますAnotherForm

投稿したイベント内で、実際には のまったく新しいインスタンスを作成していますがMainForm、それを表示することはなく、AnotherForm閉じたときにとにかく破棄されます。

MainFormテキスト ボックスに何も表示されないのは、実際には変更していないの元のインスタンスを見ているためです。

これを修正する簡単な方法の 1 つは、オリジナルMainFormへの参照を に渡すことAnotherFormです。

public class AnotherForm
{
    private MainForm mainF;

    public AnotherForm(MainForm mainF)
    {
        this.mainF = mainF;
    }

    ...
    ...

    private void listView1_ItemActivate(object sender, EventArgs e)
    {
        ...
        mainF.inputTextBox.Text = input;
        ...
    }
}

注: をAnotherForm意識する代わりにMainForm、次のように切り替えてパブリック プロパティを作成することをお勧めしますAnotherForm

public class AnotherForm
{
    public InputValue { get; private set; }

    private void listView1_ItemActivate(object sender, EventArgs e)
    {
        ...
        InputValue = input;
        ...
    }
}

MainForm他のフォームが閉じているときにアクセスできるもの:

private void SomeMethodInMainForm()
{
    var newAnotherForm = new AnotherForm();

    newAnotherForm.ShowDialog();

    var inputValueFromAnotherForm = newAnotherForm.InputValue;

    // do something with the input value from "AnotherForm"
}
于 2013-11-02T01:15:53.623 に答える
0

MainFormがすでに作成されている場合、それにアクセスしてプロパティを設定するために別のものを作成することはできません。2 つの別個MainFormの を作成しました (ただし、2 番目の は表示しなかったため非表示になっています)。

やりたいことは、モーダル ダイアログ パターンのようです。MainForm は、アプリケーションのメイン ウィンドウです。メニュー リンクをクリックすると、2 番目のフォームがポップアップ表示されます。これをダイアログと呼びます。次に、そのダイアログを閉じるときに、ダイアログMainFormの返された結果として値を取得する必要があります。

MainForm では、メニュー項目のクリックを処理するイベント ハンドラーは次のようになります。

private void pickSomethingMenuItem_Click(object sender, EventArgs e)
{
    using (var picker = new PickerDialog())
    {
        if (picker.ShowDialog(this) == DialogResult.OK)
        {
            LoadSomething(picker.SomethingPicked);
        }
    }
}

次に、次のコードがダイアログ フォーム内にあります。

public string SomethingPicked { get; private set; }

private void somethingListView_ItemActivate(object sender, EventArgs e)
{
    SomethingPicked = somethingListView.SelectedItem[0].ToString();
    DialogResult = DialogResult.OK;
}

すべてのオブジェクトに意味のある名前を付けたことに注目してください。まあ、「何か」を除いて。実際にダイアログを使用して選択しているものをコードから判断することは不可能でした。オブジェクトと変数には常に意味のある名前を使用する必要があります。あなたのコードはほぼ完全に無意味です。

また、フォームの場合のように、フォームのコントロールを公開することはほとんどありませんinputTextBox。共有したい値は常にパブリック プロパティとして公開する必要があります。

于 2013-11-02T01:16:36.250 に答える