利用datagrid编辑数据

<form runat="server">

  <ASP:DataGrid id="MyDataGrid" runat="server"
       CellPadding = "2"
       EditItemStyle-BackColor="yellow"
       DataKeyField="ISBN"//后面可以使用DataKeys集合的行索引来获取该行的ISBN栏的值
       OnEditCommand="DoItemEdit"//Edit事件处理
       OnUpdateCommand="DoItemUpdate"//Update事件
       OnCancelCommand="DoItemCancel"//Cancel事件
       AutoGenerateColumns="False">

    <Columns>

      <ASP:BoundColumn DataField="ISBN" HeaderText="ISBN" ReadOnly="True" />//isbn栏(显示文本)

      <ASP:TemplateColumn HeaderText="Title">//模版列
        <ItemTemplate>
          <ASP:Label Text='<%# DataBinder.Eval(Container.DataItem, "Title") %>' runat="server" />
        </ItemTemplate>
        <EditItemTemplate>//EditItemIndex指向行的栏将显示此模版
          <ASP:TextBox id="txtTitle" Size="60"
               Text='<%# DataBinder.Eval(Container.DataItem, "Title") %>' runat="server" />
        </EditItemTemplate>
      </ASP:TemplateColumn>

      <ASP:BoundColumn DataField="PublicationDate" HeaderText="Published" />//Published文本栏

      <ASP:EditCommandColumn
           EditText="Edit"
           CancelText="Cancel"
           UpdateText="Update" />//编辑栏(显示为链接形式)

    </Columns>

  </ASP:DataGrid>

</form>

脚本:
<script language="C#" runat="server">

 void Page_Load(Object sender, EventArgs e)
 {
  if (!Page.IsPostBack)
   BindDataGrid();  // create data set and bind to grid control
 }

 
 void DoItemEdit(Object objSource, DataGridCommandEventArgs objArgs)
 {
  lblSQL.Text = "";  // clear text from label that shows SQL statement

  // set the EditItemIndex property of the grid to this item's index
               //设置EditItemIndex属性为用户所电击的行标
  MyDataGrid.EditItemIndex = objArgs.Item.ItemIndex;
  BindDataGrid();  // bind the data and display it
 }


 void DoItemUpdate(Object objSource, DataGridCommandEventArgs objArgs)
 {
  // get a reference to the title and publication date text boxes
                //objArgs.Item为激发事件的控件所在行的引用,FindControl则寻找id为txtTitle的textbox
  TextBox objTitleCtrl = (TextBox)objArgs.Item.FindControl("txtTitle");
                   //取出激发事件的控件所在行第三个单元中第一个控件(因为该Published栏无ID
                   //故不能使用findcontrol方法来查找)
  TextBox objPubDateCtrl = (TextBox)objArgs.Item.Cells[2].Controls[0];

  // create a suitable SQL statement and execute it
  string strSQL = "UPDATE Booklist SET Title='" + objTitleCtrl.Text + "', "
     + "PublicationDate='" + objPubDateCtrl.Text + "' "
     + "WHERE ISBN='" + MyDataGrid.DataKeys[objArgs.Item.ItemIndex] + "'";
  ExecuteSQLStatement(strSQL);//数据库更新操作

  // set EditItemIndex property of grid to -1 to switch out of Edit mode
  MyDataGrid.EditItemIndex = -1;//设为初始值
  BindDataGrid();  // bind the data and display it
 }


 void DoItemCancel(Object objSource, DataGridCommandEventArgs objArgs)
 {
  // set EditItemIndex property of grid to -1 to switch out of Edit mode
  MyDataGrid.EditItemIndex = -1;
  BindDataGrid();  // bind the data and display it
 }


 void ExecuteSQLStatement(string strSQL)
 {
  // this is where the SQL statement would be executed against the
  // original data source. In this example, we're simply displaying
  // the statement in a Label on the page
  lblSQL.Text = "<b>The SQL statement that would be executed is:</b><br />" + strSQL;
 }


 void BindDataGrid()
 {
  // get connection string from ../global/connect-strings.ascx user control
  string strConnect = ctlConnectStrings.OLEDBConnectionString;

  // create a SQL statement to select some rows from the database
  string strSelect = "SELECT * FROM BookList WHERE ISBN LIKE '%18610025%'";

  // create a variable to hold an instance of a DataReader object
  OleDbDataReader objDataReader;

  try
  {
   // create a new Connection object using the connection string
   OleDbConnection objConnect = new OleDbConnection(strConnect);

   // open the connection to the database
   objConnect.Open();

   // create a new Command using the connection object and select statement
   OleDbCommand objCommand = new OleDbCommand(strSelect, objConnect);

   // execute the SQL statement against the command to get the DataReader
   objDataReader = objCommand.ExecuteReader();
  }
  catch (Exception objError)
  {
   // display error details
   outError.InnerHtml = "<b>* Error while accessing data</b>.<br />"
        + objError.Message + "<br />" + objError.Source + "<p />";
   return;  //  and stop execution
  }

  // set the DataSource property and bind the grid
  MyDataGrid.DataSource = objDataReader;
  MyDataGrid.DataBind();
 }

</script>
注:
TextBox objTitleCtrl = (TextBox)objArgs.Item.FindControl("txtTitle");
TextBox objPubDateCtrl = (TextBox)objArgs.Item.Cells[2].Controls[0];
这两条语句而言,后者最适用于当栏是普通的BoundColumn或是自动生成的情况(没有定义ID)--而不适用于利用模版创建的自定义栏(
这就是为什么对Title栏使用FindControl的原因(定义了ID))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用WPF MVVM模式,我们可以通过以下步骤对DataGrid进行右键单个数据提取: 1. 在ViewModel中定义一个SelectedData属性,用于保存所选数据的引用。 2. 在DataGrid中添加一个命令,该命令在右键单击时被触发。此命令应该使用鼠标事件参数获取所选行的数据,并将其分配给SelectedData属性。 3. 在DataGrid中设置RowStyle,该样式使用上一步中分配的SelectedData属性来确定是否为所选行,从而高亮显示。 以下是一个简单的示例: 在ViewModel类中添加以下代码: ```csharp private object _selectedData; public object SelectedData { get { return _selectedData; } set { _selectedData = value; OnPropertyChanged("SelectedData"); } } public ICommand GetDataCommand { get; set; } public ViewModel() { GetDataCommand = new RelayCommand<object>(GetData); } private void GetData(object parameter) { SelectedData = parameter; } ``` 在XAML中使用以下代码为DataGrid添加右键菜单和行选中样式: ```xaml <DataGrid x:Name="MyDataGrid" ItemsSource="{Binding Data}" AutoGenerateColumns="True"> <DataGrid.Resources> <ContextMenu x:Key="DataGridContextMenu"> <MenuItem Header="Get Data" Command="{Binding Path=GetDataCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=DataContext}"/> </ContextMenu> </DataGrid.Resources> <DataGrid.RowStyle> <Style TargetType="{x:Type DataGridRow}"> <Setter Property="Foreground" Value="Black"/> <Setter Property="Background" Value="Transparent"/> <Style.Triggers> <DataTrigger Binding="{Binding Path=DataContext.SelectedData, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Value="{Binding}"> <Setter Property="Foreground" Value="White"/> <Setter Property="Background" Value="Blue"/> </DataTrigger> </Style.Triggers> </Style> </DataGrid.RowStyle> <DataGrid.ContextMenu> <StaticResource ResourceKey="DataGridContextMenu"/> </DataGrid.ContextMenu> </DataGrid> ``` 在此示例中,我们使用了一个RelayCommand类来实现命令,它是一个常见的MVVM助手类,可用于在ViewModel中定义ICommand属性并将其分配给XAML中的控件。我们还使用了一个DataContext.SelectedData属性,并在行样式的DataTrigger中使用它来高亮显示所选行。最后,在ContextMenu中定义了一个MenuItem,该MenuItem使用GetDataCommand命令并使用FindAncestor引用DataGridRow来获取所选数据并将其传递给ViewModel中的GetData方法。 以上就是datagrid 右键取得单数据 wpf mvvm的回答。 ### 回答2: 在 WPF MVVM 中,可以通过对 DataGrid 控件进行右键点击来获取选中的单个数据。首先,在视图层中,需要将 DataGrid 控件绑定到 ViewModel 中的一个集合属性,例如: ``` <DataGrid ItemsSource="{Binding DataList}" SelectedItem="{Binding SelectedData}" /> ``` 其中,DataList 是 ViewModel 中的一个 ObservableCollection<T> 类型的属性,用于存储需要在 DataGrid 中显示的数据。SelectedData 则是 ViewModel 中的一个 T 类型的属性,用于存储用户选中的单个数据。 在 ViewModel 层中,需要定义 SelectedData 属性的 get 和 set 方法,并在 set 方法中触发 PropertyChanged 事件,以便在视图层中更新右键菜单或其他相关控件的状态。 然后,在 DataGrid 控件的右键菜单中,可以使用 Command 控件绑定到 ViewModel 中的一个 ICommand 类型的属性或方法。在这个 ICommand 中,可以通过 SelectedData 属性获取当前选中的单个数据,并对其进行相应的操作,例如删除、编辑等。 总之,在 WPF MVVM 中,可以通过在视图层中绑定 DataGrid 控件到 ViewModel 中的集合属性,然后通过选中单个数据来触发 SelectedData 属性的 set 方法,并利用 ICommand 控件来进行相应的操作,从而实现在 DataGrid 中获取单个数据的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值