现有一用于资料选择的FORM,先用dataGrid显示未过滤的数据,然后由使用者自己设定条件过滤后,在dataGrid中显示过滤后的数据,选定某行后传给另一FORM使用,但dataView过滤后不知如何获得选定的行(过滤前是可以的)?
public frmFldList(string cnnStr,string sql,string tbName)
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent(); //
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
SqlConnection myCnn = new SqlConnection(cnnStr);
SqlDataAdapter myDataAdapter = new SqlDataAdapter();
        myCnn.Open();
myDataAdapter.SelectCommand = new SqlCommand(sql, myCnn);
DataSet myDataSet = new DataSet();
myDataSet.Clear();
myDataAdapter.Fill(myDataSet, tbName);
//dataGrid1.SetDataBinding(myDataSet, tbName);
myCnn.Close();
ds=myDataSet;
tb=tbName;
...
dataGrid1.DataSource = ds.Tables[0].DefaultView;
} private void btnFilter_Click(object sender, System.EventArgs e)
{
if (cmbFld.Text.Trim()=="" || cmbRelation.Text.Trim()=="")
   return;
string fldType=ds.Tables[tb].Columns[cmbFld.SelectedIndex].DataType.Name;
try
{
if (fldType=="Int16" || fldType=="Int32" || fldType=="Int64" || fldType=="Decimal" || fldType=="Float")
ds.Tables[0].DefaultView.RowFilter=cmbFld.Text+" "+cmbRelation.Text+" "+txtValue.Text.Trim();
else
{
if (fldType=="Datetime")
ds.Tables[0].DefaultView.RowFilter=cmbFld.Text+" "+cmbRelation.Text+" "+Convert.ToDateTime(txtValue.Text.Trim());
else
{
if (cmbRelation.Text.Trim()=="Like")
if (txtValue.Text.Trim().IndexOf("%",0)==-1) 
txtValue.Text=txtValue.Text+"%";
ds.Tables[0].DefaultView.RowFilter=cmbFld.Text+" "+cmbRelation.Text+" '"+txtValue.Text.Trim()+"'";
}
}
}
catch
{
MessageBox.Show("过滤条件有错,请重设!","提示窗口",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}

解决方案 »

  1.   


    public frmFldList(string cnnStr,string sql,string tbName){
    SqlConnection myCnn = new SqlConnection(cnnStr);
    SqlDataAdapter myDataAdapter = new SqlDataAdapter();try{        
     myCnn.Open();
    myDataAdapter.SelectCommand = new SqlCommand(sql, myCnn);
    DataSet myDataSet = new DataSet();
    myDataSet.Clear();
    myDataAdapter.Fill(myDataSet, tbName);
    //dataGrid1.SetDataBinding(myDataSet, tbName);

    ds=myDataSet;
    tb=tbName; dataGrid1.DataSource = ds.Tables[0].DefaultView;
    }
    catch(Exception ee)
    {
    MessageBox.Show(ee.Message);
    }
    finally{
    myCnn.Close();
    }
    }
      

  2.   

    TO:Teng_s2000() 
    谢谢你的回答,不过关键不在于是否有
    finally{
    myCnn.Close();
    }
    而在于dataView设定过滤后,我不知如何得到在dataGrid中选定的行记录。
      

  3.   

    我试了在dataView过滤前是可以获得选定记录的
    public void btnOk_Click(object sender, System.EventArgs e)
    {
    DataRow curRow;
    if (ds.Tables[tb].DefaultView.Count>0)
    {
    curRow= ds.Tables[tb].Rows[dataGrid1.CurrentCell.RowNumber];
    FireOnSelected(curRow[0].ToString(),curRow);
    }
    }
    但过滤后不行啊?
    用 BindingManagerBase bm=this.BindingContext[ds,tb];
    DataRowView drv=(DataRowView)bm.Current;
    MessageBox.Show(bm.Position.ToString());
    也不行!
      

  4.   

    TO:97ce_twinkle(毛毛虫) 
    DefaultView[CurrentRowIndex]中的CurrentRowIndex的如何得到,因为我不知使用者选的是第几行。
      

  5.   

    DataRowView drv = dataView[dataGrid1.CurrentCell.RowNumber].Row;
      

  6.   

    dataGrid1.CurrentCell.RowNumber  与 DataGrid.CurrentRowIndex  一样的。关键是用DefaultView来获取,而不是用DataTable来获取选中行
      

  7.   

    豁然开朗!谢了。
    顺便纠正一下bumm(......)的
    DataRowView drv = dataView[dataGrid1.CurrentCell.RowNumber].Row;
    应为
    DataRowView drv = dataView[dataGrid1.CurrentCell.RowNumber];