感谢您使用微软产品。DataGrid的重排序是在DataGrid的私有函数ColumnHeaderClicked进行的,ColumnHeaderClicked发生在DataGrid的Click事件之后,因此您无法在DataGrid的Click事件处理程序中得到排序后的结果。要捕捉ColumnHeaderClicked事件有一个方法,就是用Hook(钩子),您可以参考下面这篇文章获取有关在C#中使用钩子的信息:
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q318804关于您的问题,使用Hook并不是一种好的选择。在这里我给您提供另外一种方法。建议您不要去动态修改ComboBox的SelectedIndex的值,而是将ComboBox和DataGrid绑定为同一个DataView,如下面这个简单的例子:DataColumn dtCol = null;//Data Column variable

//Create the String array object, initialize the array with the column 
//names to be displayed
string[] arrstr ;
arrstr = new string [4];
arrstr[0] = "字段0";
arrstr[1] = "字段1";
arrstr[2] = "字段2";
arrstr[3] = "字段3";//Create the Data Table object which will then be used to hold 
//columns and rows
dataTable = new DataTable("Controls");
//Add the string array of columns to the DataColumn object 
for(int i=0; i< 4;i++)
{
string str = arrstr[i];
dtCol = new DataColumn(str);
dtCol.DataType = System.Type.GetType("System.String");
dtCol.DefaultValue   = "";
dataTable.Columns.Add(dtCol);
}for( int i=0;i<8;i++)
{
DataRow newRow;
newRow = dataTable.NewRow();
newRow[0]=i;
newRow[1]=i*i;
newRow[2]=i*i*i;
newRow[3]=i*i*i*i;
dataTable.Rows.Add(newRow);

}DataView dataView = new DataView(this.dataTable);
this.dataGrid1.DataSource = dataView;this.comboBox1.DataSource = dataView;
this.comboBox1.DisplayMember = "字段1";
this.comboBox1.ValueMember = "字段1";这样当DataGrid的排序改变(也就是DataView的Sort改变),ComboBox当前值也会自动发生变化。不知这样是否能符合您的需求。另外有一个小小的建议,实际上您不需要在帖子上指明请某某人回答,这样可以有更多的技术爱好者(如我们的版主,各位常在这里探讨问题的大侠,以及其他的微软技术工程师)共同来讨论您的问题,也便于您的问题更快的得到解决。您说好么?谢谢您关心和使用微软技术,希望我们携手把技术论坛建设好,让更多的人在这里受益!=====================
- 微软全球技术中心本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
======================

解决方案 »

  1.   

    谢谢freesoul_ms([微软] 最后的白鸟)
    我也是采用datasource来绑定combobox的,绑定的是部门表,而datagrid里是用户表同部门表关联查询得出的,即用户表只存部门号。这样该怎么办呢?
      

  2.   

    To jinchaohua:问题的关键在于DataGrid和ComboBox的数据源要是同一个DataView,这样DataGrid重新进行排序才会同步改变ComboBox中显示的值。针对具体的问题,可能有不同的做法。我不是非常清楚您实际的应用。根据我的理解,您的DataGrid的查询结果里没有ComboBox具体绑定的部门表里的那一列,是么?那我建议您在关联查询时在查询结果里也选择那一列,例如,将所有的查询结果(包含那一列)fill到一个DataSet中,然后根据这个DataSet的DataTable产生一个新的DataView,分别将该DataView指定为DataGrid和ComboBox的数据源。如果您不想在DataGrid中显示那一列,也很简单,只要为DataGrid添加一个DataGridTableStyle用于控制其显示即可。例如,刚刚提及的那列处于DataGrid的第一列,只要设置相应的GridColumnStyle的Width为0即可:DataGridTableStyle dgdtblStyle = new DataGridTableStyle();
    dgdtblStyle.MappingName = this.dataGrid1.Tables[0].TableName; this.dataGrid1.TableStyles.Add(dgdtblStyle);
    GridColumnStylesCollection colStyle;
    colStyle = this.dataGrid1.TableStyles[0].GridColumnStyles;
    colStyle[0].Width = 0;DataGrid的显示可以通过DataGridTableStyle来控制,但是为了实现您想要的目的,DataGrid和ComboBox的数据源一定要是同一个DataView。您的问题比较具体,可能很难一下子通过这样简单的回答一下子理清。希望能为您开阔一下思路,为您带来一点小小的启发。非常感谢您关心和使用微软技术,很高兴和您交流,希望您的问题早日得到解决!======================
    - 微软全球技术中心本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
    为了为您创建更好的讨论环境,请参加我们的用户满意度调查(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
    ======================