0

2 つのフォーム (フォーム 1 とフォーム 2) があり、ダイアログ ボックスのデータ グリッド ビューに入力することで、フォーム 1 からフォーム 2 にデータ テーブルを渡すことができました。選択した行でのダブルクリック イベントをキャプチャするイベント ハンドラーもあります。イベントが発生すると、フォーム2のクリックイベントからフォーム1のテキストボックスを設定したいと思います。何を試しても、テキストボックス内のテキストを表示できないようです。以下は私のコードです:

    //Code begins here
    //....Function to fill data table from form 1 and pass to form 2
    private void buttonNewEntryLookUp_Click(object sender, EventArgs e)
    {

        try
        {
            cs.Open();
            da.SelectCommand = new SqlCommand("Select ctx_customername AS Customer, ctx_contactname AS Contact, ctx_custaddress1 AS Address, ctx_custcity AS City, ctx_custstate AS State, nno_custzip AS ZIP, ctx_custemail AS Email FROM Customers WHERE nno_custphone = '" + maskedTextBoxNewLogTel.Text + "'", cs);
            dt.Clear();
            da.Fill(dt);
        }
        catch
        {
            MessageBox.Show("Connection to Database could not be established, please close this application and try again. If problem continues please contact server Admin. Thank you.", "AAMP");
            //Display this message if connection could not be made
        }
        cs.Close();//close connection to db
        if (dt.Rows.Count == 0)//if there are no returned results then this must be a new entry into the database
        {
            MessageBox.Show("Phone Number Not Found in Database.", "AAMP");
        }
        else//number was found
        {
            Form2 form2 = new Form2(dt);//create object of form 2 and pass the data table.
            form2.ShowDialog();//show form 2 with data table in the grid view.

        }
    }
    public void getContactInfo(string[] contactInfo)
    {
        textBoxNewLogCustomerName.Text = contactInfo[0];
        textBoxNewLogContactName.Text = contactInfo[1];
        textBoxNewLogAddress.Text = contactInfo[2];
        textBoxNewLogCity.Text = contactInfo[3];
        textBoxNewLogState.Text = contactInfo[4];
        textBoxNewLogZIP.Text = contactInfo[5];
        textBoxNewLogEmail.Text = contactInfo[6];
    }

    //code for form 2
    public partial class Form2 : Form
{  
    /*Globals for Form 2*/
    DataTable g_dt;
    public Form2(DataTable dt)
    {
        InitializeComponent();
        dataGridViewLookUp.DataSource = dt;
        g_dt = dt;
    }

    private void dataGridViewLookUp_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        Form1 form1 = new Form1();
        string[] contactInfo = new string[7];
        contactInfo[0] = Convert.ToString(g_dt.Rows[e.RowIndex]["Customer"]);
        contactInfo[1] = Convert.ToString(g_dt.Rows[e.RowIndex]["Contact"]);
        contactInfo[2] = Convert.ToString(g_dt.Rows[e.RowIndex]["Address"]);
        contactInfo[3] = Convert.ToString(g_dt.Rows[e.RowIndex]["City"]);
        contactInfo[4] = Convert.ToString(g_dt.Rows[e.RowIndex]["State"]);
        contactInfo[5] = Convert.ToString(g_dt.Rows[e.RowIndex]["ZIP"]);
        contactInfo[6] = Convert.ToString(g_dt.Rows[e.RowIndex]["Email"]);
        form1.getContactInfo(contactInfo);//return the row number being clicked.
        this.Close();

    }
}

データ テーブルをフォーム 2 に渡し、正しい情報を取得して文字列配列を埋めることに成功しましたが、getContactInfo 関数を呼び出して文字列配列を返すと、テキスト ボックスにデータを設定できないようです。誰かお願いします、助けてください!

ありがとう。

4

4 に答える 4

0

エラーが発生しているのですか、それともデータが表示されていないだけですか。たぶん、ToString()メソッド内の各stringarrayインデックスの背後にあるメソッドを試してくださいgetcontactinfo。(すなわちcontactInfo[0].ToString();

于 2012-08-15T18:17:20.197 に答える
0

OPは少しあいまいですが、これを行うコードがいくつかあり、フォーム2のデータを取得してフォーム1に送り返します。

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

    private void btnGroupNameLookup_Click(object sender, EventArgs e)
    {
        //instantiate an instance of the grp name lookup form
        frmGroupNameLookup lookupName = new frmGroupNameLookup();
        //add an event handler to update THIS form when the lookup
        //form is updated. (This is when LookupUpdated fires
        lookupName.GroupNamesFound += new frmGroupNameLookup.LookupHandler(lookupName_GroupNamesFound);
        //rc.ReconCFUpdated += new ReconCaseFileChecklist.ReconCFListHandler(ReconCFForm_ButtonClicked);

        lookupName.Show();

    }

    void lookupName_GroupNamesFound(object sender, GroupNameLookupUpdateEventArgs e)
    {
        //update the list boxes here            
        foreach (string s in e.Parents)
        {
            lstFilteredGroupParents.Items.Add(s);
        }

        foreach (string s in e.Groups)
        {
            lstFilteredGroups.Items.Add(s);
            //link supgroups and plan ids
            GetFilteredSubgroupNos(s);
            GetFilteredPlanIds(s);
        }

        //ensure dupes are stripped out
        //filter out duplicates 
        var noDupeSubgroups = subgroupList.Distinct().ToList();
        noDupeSubgroups.Sort();

        foreach (string s in noDupeSubgroups)
        {
            lstFilteredSubgroups.Items.Add(s);
        }

        var noDupePlanIDs = planIDList.Distinct().ToList();
        noDupePlanIDs.Sort();

        foreach (string s in noDupePlanIDs)
        {
            lstFilteredPlanID.Items.Add(s);
        }

    }

Form2 から

public partial class frmGroupNameLookup : Form
{
    //add a delegate, the GroupNameLookupUpdateEventArgs class is defined at the bottom
    //of this file
    public delegate void LookupHandler(object sender, GroupNameLookupUpdateEventArgs e);

    //add an event of the delegate type
    public event LookupHandler GroupNamesFound;

    //this event closes the forms and passes 2 lists back to form 1
    private void btnCommit_Click(object sender, EventArgs e)
    {
        List<string> prnt = new List<string>();
        List<string> grp = new List<string>();
        //get selected rows
        if (grdLookup.SelectedRows.Count > 0)
        {

            foreach (DataGridViewRow row in grdLookup.SelectedRows)
            {
                prnt.Add(row.Cells[0].Value.ToString());
                grp.Add(row.Cells[1].Value.ToString());
            }

            //filter out duplicates 
            var noDupeParentGroups = prnt.Distinct().ToList();
            noDupeParentGroups.Sort();
            // instance the event args and pass it each value
            GroupNameLookupUpdateEventArgs args =
                new GroupNameLookupUpdateEventArgs(noDupeParentGroups, grp);

            // raise the event with the updated arguments
            this.GroupNamesFound(this, args);

            this.Dispose();
        }
    }
}

public class GroupNameLookupUpdateEventArgs : System.EventArgs
{
    // add local member variables to hold text
    private List<string> mParents = new List<string>();
    private List<string> mGroups = new List<string>();

    // class constructor
    public GroupNameLookupUpdateEventArgs(List<string> sParents, List<string> sGroups)
    {
        this.mParents = sParents;
        this.mGroups = sGroups;
    }

    // Properties - Viewable by each listener
    public List<string> Parents
    {
        get { return mParents; }
    }

    public List<string> Groups
    {
        get { return mGroups; }
    }
}
于 2012-08-15T18:46:30.943 に答える
0

Form2 のコンストラクターにデータテーブルを渡しています。

Form2 form2 = new Form2(dt);

代わりに、Form1 全体への参照を渡すことができます。

Form2 form2 = new Form2(this);

次に、Form2 がデータの更新に使用できるパブリック メソッドを Form1 に作成します。このようなもの:

//In Form1
public DataTable getDataTable(){
  //return datatable
}

public void setTextBoxValue(string Value){
  //Set the value
}

そしてForm2で

private Form1 _form1;

public Form2(Form1 form1){
  _form1 = form1;
  dataGridViewLookUp.DataSource = _form1.getDataTable();
  g_dt = dt;
}

private void dataGridViewLookUp_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
{
  _form1.setTextBoxValue(Convert.ToString(g_dt.Rows[e.RowIndex]["Customer"]));
  //etc
}
于 2012-08-15T18:58:06.130 に答える
0

単純。連絡先情報を Form2 のメソッド public にして、form1 の ShowDialog() の後に割り当てるだけです。

else//number was found  
        {  
            Form2 form2 = new Form2(dt);//create object of form 2 and pass the data table.  
            form2.ShowDialog();//show form 2 with data table in the grid view.  
            getContactInfo(form2.ContactInfoFromForm2);
        }  
于 2012-08-15T19:02:10.433 に答える