如题,
parentForm是一个mdi容器,childForm有一个DataGrid,绑定了数据,选中其中一条记录。
点击parentForm的工具栏的按钮对选中的记录进行操作,请问要怎么处理?还是最好将工具栏和数据绑定控件放在同一个form里?mdi容器一般在什么情况下使用?如果不使用mdi容器,就要把很多功能模块都放在一个form里,似乎不台合适,我也不能老用ShowDialog吧

解决方案 »

  1.   

    最简单的方法是用反射取得子窗体所在的 dataGrid对象可以参参一下 Type.GetField(...) 取得对象。
      

  2.   

    在你子窗体定义几个 public 对象不就可以访问了了吗?public CurrencyManager cm = ...
      

  3.   

    反射取得子窗体所在的 dataGrid对象 ?不能理解
      

  4.   

    定义行变量:public static int row。
      

  5.   

    我觉得不如在子窗体定义一个方法,在父窗体中工具条的事件中调用这个方法来处理子窗体中的事情.这样灵活性可能会好点.如果要在父窗体上来处理这些事,将来子窗体类型增加了怎么办?现在有DATAGRID类型的,将来没有DATAGIRD的子窗体呢?
      

  6.   

    首先在 弹出的窗体设置DoubleClick事件:(我是抄来的,嘿嘿) //---------------其他窗体调用客户信息窗体,双击选择数据并回送--------------
    private void dgrd_ClientData_DoubleClick(object sender, System.EventArgs e)
    {
    if (this.dgrd_ClientData.ReadOnly == true) //判断如果是在销售单中生成的窗体则不响应DataGrid的双击事件
    {
    int intCurrentRowNumber = this.dgrd_ClientData.CurrentCell.RowNumber;
    string sendClientID,sendClientName;
    sendClientID = this.dgrd_ClientData[intCurrentRowNumber,0].ToString().Trim();
    sendClientName = this.dgrd_ClientData[intCurrentRowNumber,2].ToString().Trim();
    string [] sendArray = new string [] {sendClientID,sendClientName};
    SellTable.inputTextDataArray[0] = sendArray[0];
    SellTable.inputTextDataArray[1] = sendArray[1];
    this.Close();
    }
    }然后在要获得其数据的窗口里面://----------创建窗体,共用户选择客户----------
    private void cmb_Client_DropDown(object sender, System.EventArgs e)
    {
    ClientDataManage newFrm = new ClientDataManage(false);
    newFrm.setDataGridReadOnly();
    newFrm.ShowDialog();
    this.cmb_ClientID.IntegralHeight = false;//使组合框不调整大小以显示其所有项
    this.cmb_ClientID.DroppedDown = false;//使组合框不显示其下拉部分
    this.cmb_ClientID.Items[0] = inputTextDataArray[0];
    this.cmb_ClientID.SelectedIndex = 0;
    this.txt_Company.Text = inputTextDataArray[1];
    this.cmb_ClientID.IntegralHeight = true;//恢复默认值
    SendKeys.Send("{Tab}");//向活动应用程序发送Tab键,跳到下一控件
    } //--------将所选客户的相关数据读入窗体---------
    private void cmb_Client_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    this.txt_Company.Text = "";
    string strSearchWord = this.cmb_ClientID.Text;
    string sendSQL = "select 客户编号,名称 from 客户清单 where 客户编号 = '" + strSearchWord + "'";
    DataTable tempDataTable = this.link.SelectDataBase(sendSQL);
    if (tempDataTable.Rows.Count>0)
    {
    inputTextDataArray[0] = tempDataTable.Rows[0][0].ToString().Trim();
    inputTextDataArray[1] = tempDataTable.Rows[0][1].ToString().Trim();
    this.setTextData();
    SendKeys.Send("{Tab}");//向活动应用程序发送Tab键,跳到下一控件
    }
    }就是2个窗体,3个事件,通过inputTextDataArray数组传递信息搞定
      

  7.   

    用接口
    比如子窗口实现IEdit
    MDIForm在打开子窗口时检查是不是IEdit接口,如果是显示编辑按钮,点击时
    IEdit subForm = this.ActiveForm as IEdit;
    subForm.Edit()具体处理还是在subForm内,这样系统扩展性强
      

  8.   

    在子窗体中定义好对数据操作的函数.
    在父窗体调用子窗体这个函数就可以.
    最好不要把对子窗体中数据的操作拉到父窗体.父窗体中-------------------
    childForm.Function();子窗体中-------------------
    public void Function()
    {
        // 对数据操作的代码
    }